This is Kara’s attempt to think about patterns of prevalence across sites: What proportion of participants in each site endorsed each question, and can we find “clusters” of questions that were either similar in prevalence across sites or difference across sites in various ways?
This is inspired by Ann’s ideas on 2018-10-08, but uses a somewhat different strategy.
Update 2018-12-17: Now including tests of hypotheses from our meeting on 2018-12-10.
Update 2019-01-14: Now including distributions (histograms) of mean responses by question, and a quick analysis of participants’ self-reported religiosity/spirtuality.
Update 2019-02-19: Now including distributions (histograms) of mean responses by question, broken down by US participants’ self-reported religiosity/spirtuality.
Notes: per our conversation with Nikki, we are dropping one question (#53), which was a repeated question in all sites except for China.
Demographics
Sample size
| taves_ctry |
n |
| us |
104 |
| ghana |
136 |
| thailand |
106 |
| china |
95 |
| vanuatu |
99 |
Gender
| taves_ctry |
female |
male |
missing data |
other |
| us |
0.42 |
0.56 |
0.02 |
NA |
| ghana |
0.44 |
0.54 |
0.02 |
NA |
| thailand |
0.20 |
0.77 |
0.02 |
0.01 |
| china |
0.52 |
0.47 |
NA |
0.01 |
| vanuatu |
0.32 |
0.67 |
0.01 |
NA |
Make new dataset
First, I’m going to make a new dataset where, for each question, we have the proportion of yes reponses from each of the five field sites.
Joining, by = "taves_subj"
Joining, by = "question"
Setting row names on a tibble is deprecated.
Here’s a sample of what this new dataset looks like (5 of the 59 columns):
Please specify format in kable. kableExtra can customize either HTML or LaTeX outputs. See https://haozhu233.github.io/kableExtra/ for details.
| US |
0.0961538 |
0.0776699 |
0.6310680 |
0.2549020 |
0.2788462 |
| Ghana |
0.4409449 |
0.3360000 |
0.6220472 |
0.3840000 |
0.4765625 |
| Thailand |
0.0952381 |
0.0769231 |
0.8190476 |
0.2380952 |
0.4761905 |
| China |
0.1279070 |
0.2808989 |
0.8395062 |
0.2159091 |
0.5308642 |
| Vanuatu |
0.6000000 |
0.3789474 |
0.7608696 |
0.3541667 |
0.8210526 |
Hierarchical clustering
My first instinct was to try hierarchical clustering on this new dataset. Each question is associated with 5 prevalences (one for each of our 5 fieldsites). In this cluster analysis, we’re looking for questions that share similar patterns of prevalence across the fieldsites - e.g., one cluster might identify a set questions where the prevalence is roughly the same across the 5 sites; another cluster might identify a set of questions where the prevalence is high in Ghana and Vanuatu but low everywhere else; etc. I think this captures some of the spirit of what Ann was after today (10/8)… though maybe not everything (e.g., it might not differentiate between questions where prevalence is high across the 5 sites vs. questions where prevalence is low across the 5 sites).

After some playing around with this, I’m going to extract 9 clusters here - I’ve colored them according such above. This is a subjective call - you could extract more or fewer. I think this seems kind of reasonable eyeballing the plot above.
Joining, by = "question_text"
Joining, by = "question"
Cluster 1
Here I’ll plot the prevalence of endorsements in each site for each of the questions in Cluster 1. (Note that the order of clusters doesn’t align with the top to bottom order of the previous plot - sorry if that’s confusing, it’s just an artifact of how the previous plot worked. Not very meaningful. This is the light orange cluster above.)
I’ll plot these questions in descending order of their prevalence in the US sample, just as a point of reference.

It looks like the prevalence pattern here is low in the US and Thailand (~25%), slightly higher in China (but under 50%), and higher in Ghana and Vanuatu (generally over 50%).
I won’t try to interpret the meaning of these questions right now.
Cluster 2
Now I’ll plot the prevalence of endorsements in each site for each of the questions in Cluster 2 (the pink cluster in the overall plot).
Again, I’ll plot these questions in descending order of their prevalence in the US sample, just as a point of reference.

It looks like the prevalence pattern here is something like very low in the US (generally < 10%), pretty low in Thailand and China (generally < 25%), middling in Ghana (around 25%), and moderate in Vanuatu (under 50%). But there are some exceptions here - e.g., #26 (where Thailand is highest); #47 and #39 (where all sites are comparable); #51 (where Ghana, Thailand, and China are all comparable). I would say that these questions are less good examples of this “cluster.”
Cluster 3
Now I’ll plot the prevalence of endorsements in each site for each of the questions in Cluster 3 (the dark red cluster in the overall plot).
Again, I’ll plot these questions in descending order of their prevalence in the US sample, just as a point of reference.

It looks like the prevalence pattern here is generally low (~25%) across the board, but slightly higher in Ghana and Vanuatu (closer to 40%).
Cluster 4
Now I’ll plot the prevalence of endorsements in each site for each of the questions in Cluster 4 (the light blue cluster in the overall plot).
Again, I’ll plot these questions in descending order of their prevalence in the US sample, just as a point of reference.

It looks like the prevalence pattern here is generally comparable and pretty high (~75%) across the board, especially in China and Thailand.
Cluster 5
Now I’ll plot the prevalence of endorsements in each site for each of the questions in Cluster 5 (the dark orange cluster in the overall plot).
Again, I’ll plot these questions in descending order of their prevalence in the US sample, just as a point of reference.

It looks like the prevalence pattern here is generally comparable and moderate (~25%) across the board, but higher in Ghana and Vanuatu (closer to 50%).
Cluster 6
Now I’ll plot the prevalence of endorsements in each site for each of the questions in Cluster 6 (the dark green cluster in the overall plot).
Again, I’ll plot these questions in descending order of their prevalence in the US sample, just as a point of reference.

It looks like the prevalence pattern here is generally comparable and moderate (~25%) in the US and Thailand, but higher in Ghana, China, and especially Vanuatu (>50%).
Cluster 7
Now I’ll plot the prevalence of endorsements in each site for each of the questions in Cluster 7 (the dark blue cluster in the overall plot).
Again, I’ll plot these questions in descending order of their prevalence in the US sample, just as a point of reference.

It looks like the prevalence pattern here is generally moderate (~25%) in the US and Thailand, higher in Ghana and Vanuatu (~50%), and especially high in China (~60%).
Cluster 8
Now I’ll plot the prevalence of endorsements in each site for each of the questions in Cluster 8 (the light purple cluster in the overall plot).
Again, I’ll plot these questions in descending order of their prevalence in the US sample, just as a point of reference.

It looks like the prevalence pattern here is generally moderate (~25%) across the board, maybe a little higher in China and Vanuatu (closer to 40%).
Cluster 9
Now I’ll plot the prevalence of endorsements in each site for each of the questions in Cluster 9 (the light green cluster in the overall plot).
Again, I’ll plot these questions in descending order of their prevalence in the US sample, just as a point of reference.

It looks like the prevalence pattern here is generally high (~50%) across the board, and espcially in China (closer to 70%).
Hierarchical clustering pretending we only had 2 sites (US and Ghana)
Here I will try to approximate what it would be like to do this analysis with only 2 sites, to give a sense of whether this would make sense for the 1.0 data. I’ll limit the data to only 2 sites (US and Ghana) and do everything I did before.
Setting row names on a tibble is deprecated.

Here, 8 seems like a reasonable number of clusters to look at. I wish that the light orange cluster weren’t a cluster of 1, but it requires going down to just 5 clusters to get there, which means that the other clusters get quite large.
Joining, by = "question_text"
Joining, by = "question"
Cluster 1
Following the 5-site analysis above, here I’ll plot the prevalence of endorsements in each site for each of the questions in Cluster 1. (This is the pink cluster above.)
I’ll plot these questions in descending order of their prevalence in the US sample, just as a point of reference.

It looks like the prevalence pattern here is moderate in the US (>25%) and higher in Ghana (close to 50%).
Cluster 2
Now I’ll plot the prevalence of endorsements in each site for each of the questions in Cluster 2 (the light green cluster in the overall plot).
Again, I’ll plot these questions in descending order of their prevalence in the US sample, just as a point of reference.

It looks like the prevalence pattern here is low in the US (<10%) and moderate in Ghana (~25%).
Cluster 3
Now I’ll plot the prevalence of endorsements in each site for each of the questions in Cluster 3 (the dark green cluster in the overall plot).
Again, I’ll plot these questions in descending order of their prevalence in the US sample, just as a point of reference.

It looks like the prevalence pattern here is relatively high across the board (>50%).
Cluster 4
Now I’ll plot the prevalence of endorsements in each site for each of the questions in Cluster 4 (the dark blue cluster in the overall plot).
Again, I’ll plot these questions in descending order of their prevalence in the US sample, just as a point of reference.

It looks like the prevalence pattern here is generally moderate across the two sites (~25%), slightly higher in Ghana (~40%).
Cluster 5
Now I’ll plot the prevalence of endorsements in each site for each of the questions in Cluster 5 (the dark red cluster in the overall plot).
Again, I’ll plot these questions in descending order of their prevalence in the US sample, just as a point of reference.

It looks like the prevalence pattern here is generally comparable and moderate (close to 50%) across the board - if anything, perhaps a little higher in the US on a couple of items.
Cluster 6
Now I’ll plot the prevalence of endorsements in each site for each of the questions in Cluster 6 (the light blue cluster in the overall plot).
Again, I’ll plot these questions in descending order of their prevalence in the US sample, just as a point of reference.

It looks like the prevalence pattern here is very low in the US (<10%) and slightly higher in Ghana (~20%).
Cluster 7
Now I’ll plot the prevalence of endorsements in each site for each of the questions in Cluster 7 (the dark orange cluster in the overall plot).
Again, I’ll plot these questions in descending order of their prevalence in the US sample, just as a point of reference.

It looks like the prevalence pattern here is fairly low in the US (<25%) and high in Ghana (>50%).
Cluster 8
Now I’ll plot the prevalence of endorsements in each site for each of the questions in Cluster 8 (the other half of the dark green cluster in the overall plot).
Again, I’ll plot these questions in descending order of their prevalence in the US sample, just as a point of reference.

This is one item and it happens to be moderate inthe US and high in Ghana. I wouldn’t make much of this factor.
Testing predictions
These are predictions we articulated as a group on 2018-12-10
Clusters 6794 are more common than the others
Generalized linear mixed model fit by maximum likelihood (Laplace
Approximation) [glmerMod]
Family: binomial ( logit )
Formula: prev ~ level1 + (1 | question) + (1 | taves_ctry)
Data: hclust_df_grouped
Weights: n
AIC BIC logLik deviance df.resid
2922.3 2937.1 -1457.2 2914.3 291
Scaled residuals:
Min 1Q Median 3Q Max
-5.3522 -1.3453 -0.1095 1.2750 5.9963
Random effects:
Groups Name Variance Std.Dev.
question (Intercept) 0.1546 0.3932
taves_ctry (Intercept) 0.1483 0.3851
Number of obs: 295, groups: question, 59; taves_ctry, 5
Fixed effects:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -0.8383 0.1833 -4.574 4.77e-06 ***
level16794 1.0809 0.1163 9.297 < 2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr)
level16794 -0.184

Yes, this prediction is upheld (both in the aggregate and looking at each site individually).
Clusters 679 appraised as religious more frequently than cluster 4
Joining, by = "taves_subj"
Joining, by = "question"
Linear mixed model fit by REML ['lmerMod']
Formula:
appraisal ~ level2common + (1 | question) + (1 | taves_ctry/taves_subj)
Data: d_appraisal_num2 %>% filter(!is.na(appraisal))
REML criterion at convergence: 11413.6
Scaled residuals:
Min 1Q Median 3Q Max
-2.5831 -0.6775 -0.1177 0.6578 2.7814
Random effects:
Groups Name Variance Std.Dev.
taves_subj:taves_ctry (Intercept) 0.16494 0.4061
question (Intercept) 0.01407 0.1186
taves_ctry (Intercept) 0.06927 0.2632
Residual 0.46034 0.6785
Number of obs: 5141, groups:
taves_subj:taves_ctry, 521; question, 17; taves_ctry, 5
Fixed effects:
Estimate Std. Error t value
(Intercept) -0.20296 0.12379 -1.640
level2common4 -0.08811 0.07898 -1.116
Correlation of Fixed Effects:
(Intr)
level2cmmn4 -0.116


The results for this prediction are mixed. It is not upheld in the aggregate, but seems to be true in the US, and possibly in Ghana and Vanuatu (i.e., Christian countries?).
Clusters 679 will be marked as positive/negative rather than cluster 4 (?)
Joining, by = "taves_subj"
Joining, by = "question"
Linear mixed model fit by REML ['lmerMod']
Formula:
abs(valence) ~ level2common + (1 | question) + (1 | taves_ctry/taves_subj)
Data: d_valence_num2 %>% filter(!is.na(valence))
REML criterion at convergence: 6562.9
Scaled residuals:
Min 1Q Median 3Q Max
-2.1912 -0.9412 0.3295 0.8207 2.2519
Random effects:
Groups Name Variance Std.Dev.
taves_subj:taves_ctry (Intercept) 0.027980 0.1673
question (Intercept) 0.014461 0.1203
taves_ctry (Intercept) 0.004901 0.0700
Residual 0.192904 0.4392
Number of obs: 5077, groups:
taves_subj:taves_ctry, 521; question, 17; taves_ctry, 5
Fixed effects:
Estimate Std. Error t value
(Intercept) 0.60997 0.04609 13.233
level2common4 -0.16528 0.07799 -2.119
Correlation of Fixed Effects:
(Intr)
level2cmmn4 -0.302

Yes, this prediction is upheld (both in the aggregate and looking at each site individually, with the possible exception of Vanuatu).
Cluster 69 will be more positive than cluster 7
Linear mixed model fit by REML ['lmerMod']
Formula: valence ~ level3 + (1 | question) + (1 | taves_ctry/taves_subj)
Data: d_valence_num2 %>% filter(!is.na(valence))
REML criterion at convergence: 7968.2
Scaled residuals:
Min 1Q Median 3Q Max
-2.78548 -0.68151 0.06094 0.73060 2.99054
Random effects:
Groups Name Variance Std.Dev.
taves_subj:taves_ctry (Intercept) 0.049447 0.22237
question (Intercept) 0.104683 0.32355
taves_ctry (Intercept) 0.003939 0.06276
Residual 0.398107 0.63096
Number of obs: 3949, groups:
taves_subj:taves_ctry, 513; question, 14; taves_ctry, 5
Fixed effects:
Estimate Std. Error t value
(Intercept) -0.02973 0.12683 -0.234
level369 0.42330 0.17416 2.431
Correlation of Fixed Effects:
(Intr)
level369 -0.688

Yes, this prediction is clearly upheld (both in the aggregate and looking at each site individually).
Clusters 679 appraised as more significant than 4
Joining, by = "taves_subj"
Joining, by = "question"
Linear mixed model fit by REML ['lmerMod']
Formula:
significance ~ level2common + (1 | question) + (1 | taves_ctry/taves_subj)
Data: d_significance_num2 %>% filter(!is.na(significance))
REML criterion at convergence: 3586.9
Scaled residuals:
Min 1Q Median 3Q Max
-3.02179 -0.65557 0.03006 0.74054 2.54980
Random effects:
Groups Name Variance Std.Dev.
taves_subj:taves_ctry (Intercept) 0.032477 0.18021
question (Intercept) 0.006291 0.07932
taves_ctry (Intercept) 0.001747 0.04179
Residual 0.102079 0.31950
Number of obs: 5075, groups:
taves_subj:taves_ctry, 520; question, 17; taves_ctry, 5
Fixed effects:
Estimate Std. Error t value
(Intercept) 0.59594 0.02989 19.936
level2common4 -0.12958 0.05166 -2.508
Correlation of Fixed Effects:
(Intr)
level2cmmn4 -0.310

Yes, this prediction is upheld (both in the aggregate and looking at each site individually).
Clusters 851 more common than clusters 32
Generalized linear mixed model fit by maximum likelihood (Laplace
Approximation) [glmerMod]
Family: binomial ( logit )
Formula: prev ~ level2uncommon + (1 | question) + (1 | taves_ctry)
Data: hclust_df_grouped
Weights: n
AIC BIC logLik deviance df.resid
1791.0 1804.4 -891.5 1783.0 206
Scaled residuals:
Min 1Q Median 3Q Max
-3.8760 -1.3721 -0.1709 1.0627 4.8106
Random effects:
Groups Name Variance Std.Dev.
question (Intercept) 0.05679 0.2383
taves_ctry (Intercept) 0.20677 0.4547
Number of obs: 210, groups: question, 42; taves_ctry, 5
Fixed effects:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -1.30327 0.21510 -6.059 1.37e-09 ***
level2uncommon851 0.66649 0.08514 7.828 4.97e-15 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr)
lvl2ncmm851 -0.268

Yes, this prediction is upheld (both in the aggregate and looking at each site individually, with the probable exception of Vanuatu).
Clusters 8 to 5 to 1: increases in divergence between countries
Bartlett test of homogeneity of variances
data: mean_prev by cluster
Bartlett's K-squared = 2.7809, df = 2, p-value = 0.249
Bartlett test of homogeneity of variances
data: mean_prev by cluster
Bartlett's K-squared = 0.61953, df = 1, p-value = 0.4312
Bartlett test of homogeneity of variances
data: mean_prev by cluster
Bartlett's K-squared = 0.83052, df = 1, p-value = 0.3621

This prediction looks like it’s upheld according to the plot (dots for each site are closest together for cluster 8 and most scattered for cluster 1). It doesn’t come out as significant in a formal test of the variability across the five sites for each cluster, but I’m not sure whether I’d expect that to come out or not, given the sample size (n = 5 sites). (Genuinely not sure!)
Clusters 8 to 5 to 1: decreases in frequency
Generalized linear mixed model fit by maximum likelihood (Laplace
Approximation) [glmerMod]
Family: binomial ( logit )
Formula: prev ~ cluster + (1 | question) + (1 | taves_ctry)
Data: hclust_df_grouped %>% filter(cluster %in% c("1", "5", "8")) %>%
mutate(cluster = factor(cluster, levels = c("8", "5", "1")))
Weights: n
AIC BIC logLik deviance df.resid
1134.8 1149.5 -562.4 1124.8 135
Scaled residuals:
Min 1Q Median 3Q Max
-4.2572 -1.0490 0.0215 0.9268 4.3298
Random effects:
Groups Name Variance Std.Dev.
question (Intercept) 0.00329 0.05736
taves_ctry (Intercept) 0.14749 0.38405
Number of obs: 140, groups: question, 28; taves_ctry, 5
Fixed effects:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -0.66146 0.17311 -3.821 0.000133 ***
cluster.L 0.14281 0.03528 4.047 5.18e-05 ***
cluster.Q 0.33253 0.03879 8.573 < 2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr) clst.L
cluster.L -0.021
cluster.Q -0.016 -0.113

No, this prediction is not upheld (either in the aggregate or looking at each site individually, with the possible exception of Thailand). If anything, cluster 1 generally seems to be the most common of these three clusters.
Clusters 32: GH and VT stand out for their endorsement
Generalized linear mixed model fit by maximum likelihood (Laplace
Approximation) [glmerMod]
Family: binomial ( logit )
Formula: prev ~ level2uncommon * taves_ctry + (1 | question)
Data:
hclust_df_grouped %>% filter(!is.na(level2uncommon)) %>% mutate(taves_ctry = factor(taves_ctry,
levels = c("US", "Ghana", "Thailand", "China", "Vanuatu")))
Weights: n
AIC BIC logLik deviance df.resid
1713.7 1750.5 -845.8 1691.7 199
Scaled residuals:
Min 1Q Median 3Q Max
-4.0518 -1.1072 -0.1083 1.1510 4.9969
Random effects:
Groups Name Variance Std.Dev.
question (Intercept) 0.0558 0.2362
Number of obs: 210, groups: question, 42
Fixed effects:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -1.35863 0.07055 -19.258 < 2e-16 ***
level2uncommon851 0.73052 0.08542 8.552 < 2e-16 ***
taves_ctryUS_other -0.18649 0.01800 -10.359 < 2e-16 ***
taves_ctryGHVT_THCH 0.53321 0.03293 16.193 < 2e-16 ***
taves_ctryGH_VT -0.30629 0.03869 -7.917 2.43e-15 ***
taves_ctryTH_CH 0.07194 0.05326 1.351 0.17682
level2uncommon851:taves_ctryUS_other 0.05719 0.02039 2.805 0.00503 **
level2uncommon851:taves_ctryGHVT_THCH -0.25031 0.03843 -6.514 7.34e-11 ***
level2uncommon851:taves_ctryGH_VT 0.13824 0.04666 2.963 0.00305 **
level2uncommon851:taves_ctryTH_CH 0.05896 0.06104 0.966 0.33407
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr) lv2851 tv_US_ t_GHVT t_GH_V t_TH_C l2851:_U l2851:_GHV
lvl2ncmm851 -0.826
tvs_ctryUS_ 0.086 -0.071
t_GHVT_THCH -0.117 0.097 0.112
tvs_ctGH_VT -0.012 0.010 0.013 -0.035
tvs_ctTH_CH 0.010 -0.008 -0.010 -0.026 0.000
lv2851:_US_ -0.076 0.070 -0.883 -0.099 -0.012 0.009
l2851:_GHVT 0.100 -0.096 -0.096 -0.857 0.030 0.023 0.098
l2851:_GH_V 0.010 -0.016 -0.011 0.029 -0.829 0.000 0.018 -0.049
l2851:_TH_C -0.008 0.010 0.009 0.023 0.000 -0.873 -0.011 -0.029
l2851:_GH_
lvl2ncmm851
tvs_ctryUS_
t_GHVT_THCH
tvs_ctGH_VT
tvs_ctTH_CH
lv2851:_US_
l2851:_GHVT
l2851:_GH_V
l2851:_TH_C 0.000

Yes, this prediction is upheld, but rather weakly: Ghana and Vanuatu stand out in both clusters 32 and clusters 851, but they stand out a little more (gap between them and other countries is a little bigger) in clusters 32.
Overall summaries of prevalence, appraisal, valence, & significance




Distributions (histograms) of mean responses by question








Religiosity of participants
“Do you consider yourself a religious or spiritual person?”
| taves_ctry |
not at all |
slightly |
somewhat |
very |
<NA> |
| us |
0.24 |
0.26 |
0.35 |
0.15 |
NA |
| ghana |
0.05 |
0.14 |
0.26 |
0.53 |
0.02 |
| thailand |
0.37 |
0.47 |
0.14 |
0.02 |
NA |
| china |
0.63 |
0.20 |
0.12 |
0.05 |
NA |
| vanuatu |
0.03 |
0.14 |
0.29 |
0.49 |
0.04 |
This seems like the most basic question we have about participant religiosity, and one that splits the US sample roughly equally into a less religious group (“not at all” or “slightly”) vs. a more religious group (“somewaht” or “very”). I will use this question to split the US sample, below.
“I consider myself a person of faith”
| taves_ctry |
strongly disagree |
disagree |
neither agree nor disagree |
agree |
strongly agree |
<NA> |
| us |
NA |
NA |
NA |
NA |
NA |
1.00 |
| ghana |
0.02 |
0.01 |
0.07 |
0.21 |
0.20 |
0.49 |
| thailand |
0.08 |
0.09 |
0.55 |
0.24 |
0.05 |
NA |
| china |
NA |
0.13 |
0.37 |
0.41 |
0.09 |
NA |
| vanuatu |
NA |
NA |
0.09 |
0.28 |
0.15 |
0.47 |
I guess we didn’t ask this question in the US?
“Do you participate in a religious or spiritual group?”
| taves_ctry |
no |
yes |
<NA> |
| us |
0.88 |
0.12 |
NA |
| ghana |
0.24 |
0.70 |
0.06 |
| thailand |
0.62 |
0.37 |
0.01 |
| china |
0.89 |
0.05 |
0.05 |
| vanuatu |
0.13 |
0.81 |
0.06 |
Overall summaries of prevalence, appraisal, valence, and signifiance, breaking down by religiosity for US participants only




Distributions (histograms) of mean responses by question, breaking down by religiosity for US participants only




LS0tCnRpdGxlOiAiS1cgbG9va2luZyBhdCBwYXR0ZXJucyBvZiBwcmV2YWxlbmNlIgpkYXRlOiAyMDE5LTAyLTE4Cm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCi0tLQoKVGhpcyBpcyBLYXJhJ3MgYXR0ZW1wdCB0byB0aGluayBhYm91dCBwYXR0ZXJucyBvZiBwcmV2YWxlbmNlIGFjcm9zcyBzaXRlczogV2hhdCBwcm9wb3J0aW9uIG9mIHBhcnRpY2lwYW50cyBpbiBlYWNoIHNpdGUgZW5kb3JzZWQgZWFjaCBxdWVzdGlvbiwgYW5kIGNhbiB3ZSBmaW5kICJjbHVzdGVycyIgb2YgcXVlc3Rpb25zIHRoYXQgd2VyZSBlaXRoZXIgc2ltaWxhciBpbiBwcmV2YWxlbmNlIGFjcm9zcyBzaXRlcyBvciBkaWZmZXJlbmNlIGFjcm9zcyBzaXRlcyBpbiB2YXJpb3VzIHdheXM/CgpUaGlzIGlzIGluc3BpcmVkIGJ5IEFubidzIGlkZWFzIG9uIDIwMTgtMTAtMDgsIGJ1dCB1c2VzIGEgc29tZXdoYXQgZGlmZmVyZW50IHN0cmF0ZWd5LgoKKipVcGRhdGUgMjAxOC0xMi0xNyoqOiBOb3cgaW5jbHVkaW5nIHRlc3RzIG9mIGh5cG90aGVzZXMgZnJvbSBvdXIgbWVldGluZyBvbiAyMDE4LTEyLTEwLgoKKipVcGRhdGUgMjAxOS0wMS0xNCoqOiBOb3cgaW5jbHVkaW5nIGRpc3RyaWJ1dGlvbnMgKGhpc3RvZ3JhbXMpIG9mIG1lYW4gcmVzcG9uc2VzIGJ5IHF1ZXN0aW9uLCBhbmQgYSBxdWljayBhbmFseXNpcyBvZiBwYXJ0aWNpcGFudHMnIHNlbGYtcmVwb3J0ZWQgcmVsaWdpb3NpdHkvc3BpcnR1YWxpdHkuCgoqKlVwZGF0ZSAyMDE5LTAyLTE5Kio6IE5vdyBpbmNsdWRpbmcgZGlzdHJpYnV0aW9ucyAoaGlzdG9ncmFtcykgb2YgbWVhbiByZXNwb25zZXMgYnkgcXVlc3Rpb24sIGJyb2tlbiBkb3duIGJ5IFVTIHBhcnRpY2lwYW50cycgc2VsZi1yZXBvcnRlZCByZWxpZ2lvc2l0eS9zcGlydHVhbGl0eS4KCmBgYHtyIGdsb2JhbF9vcHRpb25zLCBpbmNsdWRlID0gRn0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG89Riwgd2FybmluZz1GLCBjYWNoZT1GLCBtZXNzYWdlPUYpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBGfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShyZWFkeGwpCmxpYnJhcnkocHN5Y2gpCmxpYnJhcnkoZmFjdG9leHRyYSkKbGlicmFyeShnZ2RlbmRybykKbGlicmFyeShkZW5kZXh0ZW5kKQpsaWJyYXJ5KGxtZTQpCmxpYnJhcnkobGFuZ2NvZykKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IEZ9CmQwIDwtIHJlYWRfZXhjZWwoIi9Vc2Vycy9rd2Vpc21hbi9Eb2N1bWVudHMvUmVzZWFyY2ggKFN0YW5mb3JkKS9Qcm9qZWN0cy9UZW1wbGV0b24gR3JhbnQvREFUQSBXUkFOR0xJTkcvVGF2ZXMvZGF0YS9UYXZlc19mdWxsX2RhdGFzZXQueGxzeCIsIHNoZWV0ID0gNSlbLTEsXSAjIHJlbW92ZSBxdWVzdGlvbiB0ZXh0CgpxdWVzdGlvbl9rZXkgPC0gcmVhZF9leGNlbCgiL1VzZXJzL2t3ZWlzbWFuL0RvY3VtZW50cy9SZXNlYXJjaCAoU3RhbmZvcmQpL1Byb2plY3RzL1RlbXBsZXRvbiBHcmFudC9EQVRBIFdSQU5HTElORy9UYXZlcy9kYXRhL1RhdmVzX2Z1bGxfZGF0YXNldC54bHN4Iiwgc2hlZXQgPSAzKVssMTo1XSAjIG9ubHkgcmVsZXZhbnQgY29sdW1ucwoKbl9pdGVyIDwtIDUwMDAKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IEZ9CmRfYmFzZSA8LSBkMCAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgc2VsZWN0KHRhdmVzX3N1YmosIHRhdmVzXzAxOnRhdmVzXzYwZSkgJT4lCiAgc2VsZWN0KC1lbmRzX3dpdGgoImEiKSwgLWVuZHNfd2l0aCgiYiIpLCAtZW5kc193aXRoKCJjIiksIAogICAgICAgICAtZW5kc193aXRoKCJkIiksIC1lbmRzX3dpdGgoImUiKSkgJT4lCiAgZGlzdGluY3QoKSAlPiUKICBmaWx0ZXIodGF2ZXNfc3ViaiAhPSAiNDA1NDgiKSAlPiUgIyByZW1vdmUgb25lIGR1cGxpY2F0ZQogICMgY29sdW1uX3RvX3Jvd25hbWVzKCJ0YXZlc19zdWJqIikgJT4lCiAgbXV0YXRlX2F0KHZhcnMoLXRhdmVzX3N1YmopLAogICAgICAgICAgICBmdW5zKGZhY3Rvcih0b2xvd2VyKC4pLCBsZXZlbHMgPSBjKCJubyIsICJ5ZXMiKSkpKSAlPiUKICBtdXRhdGVfYXQodmFycygtdGF2ZXNfc3ViaiksCiAgICAgICAgICAgIGZ1bnMobnVtID0gYXMubnVtZXJpYyguKSAtIDEpKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXMoInRhdmVzX3N1YmoiKSAlPiUKICBzZWxlY3QoLXN0YXJ0c193aXRoKCJ0YXZlc181MyIpKQoKZF9iYXNlX251bSA8LSBkX2Jhc2UgJT4lCiAgc2VsZWN0KGVuZHNfd2l0aCgiX251bSIpKQpgYGAKCk5vdGVzOiBwZXIgb3VyIGNvbnZlcnNhdGlvbiB3aXRoIE5pa2tpLCB3ZSBhcmUgZHJvcHBpbmcgb25lIHF1ZXN0aW9uICgjNTMpLCB3aGljaCB3YXMgYSByZXBlYXRlZCBxdWVzdGlvbiBpbiBhbGwgc2l0ZXMgZXhjZXB0IGZvciBDaGluYS4KCmBgYHtyLCBpbmNsdWRlID0gRn0KZF9hcHByYWlzYWwgPC0gZDAgJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHNlbGVjdCh0YXZlc19zdWJqLCB0YXZlc18wMTp0YXZlc182MGUpICU+JQogIHNlbGVjdCh0YXZlc19zdWJqLCBlbmRzX3dpdGgoImIiKSkgJT4lCiAgZGlzdGluY3QoKSAlPiUKICBmaWx0ZXIodGF2ZXNfc3ViaiAhPSAiNDA1NDgiKSAlPiUgIyByZW1vdmUgb25lIGR1cGxpY2F0ZQogICMgY29sdW1uX3RvX3Jvd25hbWVzKCJ0YXZlc19zdWJqIikgJT4lCiAgbXV0YXRlX2F0KHZhcnMoLXRhdmVzX3N1YmopLAogICAgICAgICAgICBmdW5zKGZhY3Rvcih0b2xvd2VyKC4pLCBsZXZlbHMgPSBjKCJubyIsICJ1bnN1cmUiLCAieWVzIikpKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoLXRhdmVzX3N1YmopLAogICAgICAgICAgICBmdW5zKG51bSA9IGFzLm51bWVyaWMoLikgLSAyKSkgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKCJ0YXZlc19zdWJqIikgJT4lCiAgc2VsZWN0KC1zdGFydHNfd2l0aCgidGF2ZXNfNTMiKSkKCmRfYXBwcmFpc2FsX251bSA8LSBkX2FwcHJhaXNhbCAlPiUKICBzZWxlY3QoZW5kc193aXRoKCJfbnVtIikpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBGfQpkX3ZhbGVuY2UgPC0gZDAgJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHNlbGVjdCh0YXZlc19zdWJqLCB0YXZlc18wMTp0YXZlc182MGUpICU+JQogIHNlbGVjdCh0YXZlc19zdWJqLCBlbmRzX3dpdGgoImQiKSkgJT4lCiAgZGlzdGluY3QoKSAlPiUKICBmaWx0ZXIodGF2ZXNfc3ViaiAhPSAiNDA1NDgiKSAlPiUgIyByZW1vdmUgb25lIGR1cGxpY2F0ZQogICMgY29sdW1uX3RvX3Jvd25hbWVzKCJ0YXZlc19zdWJqIikgJT4lCiAgbXV0YXRlX2F0KHZhcnMoLXRhdmVzX3N1YmopLAogICAgICAgICAgICBmdW5zKGZhY3Rvcih0b2xvd2VyKC4pLCBsZXZlbHMgPSBjKCJzb21ld2hhdCBuZWdhdGl2ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhYm91dCBuZXV0cmFsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvbWV3aGF0IHBvc2l0aXZlIikpKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoLXRhdmVzX3N1YmopLAogICAgICAgICAgICBmdW5zKG51bSA9IGFzLm51bWVyaWMoLikgLSAyKSkgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKCJ0YXZlc19zdWJqIikgJT4lCiAgc2VsZWN0KC1zdGFydHNfd2l0aCgidGF2ZXNfNTMiKSkKCmRfdmFsZW5jZV9udW0gPC0gZF92YWxlbmNlICU+JQogIHNlbGVjdChlbmRzX3dpdGgoIl9udW0iKSkKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IEZ9CmRfc2lnbmlmaWNhbmNlIDwtIGQwICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICBzZWxlY3QodGF2ZXNfc3ViaiwgdGF2ZXNfMDE6dGF2ZXNfNjBlKSAlPiUKICBzZWxlY3QodGF2ZXNfc3ViaiwgZW5kc193aXRoKCJlIikpICU+JQogIGRpc3RpbmN0KCkgJT4lCiAgZmlsdGVyKHRhdmVzX3N1YmogIT0gIjQwNTQ4IikgJT4lICMgcmVtb3ZlIG9uZSBkdXBsaWNhdGUKICAjIGNvbHVtbl90b19yb3duYW1lcygidGF2ZXNfc3ViaiIpICU+JQogIG11dGF0ZV9hdCh2YXJzKC10YXZlc19zdWJqKSwKICAgICAgICAgICAgZnVucyhmYWN0b3IodG9sb3dlciguKSwgbGV2ZWxzID0gYygibm90IHNpZ25pZmljYW50IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvbWV3aGF0IHNpZ25pZmljYW50IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZlcnkgc2lnbmlmaWNhbnQiKSkpKSAlPiUKICBtdXRhdGVfYXQodmFycygtdGF2ZXNfc3ViaiksCiAgICAgICAgICAgIGZ1bnMobnVtID0gKGFzLm51bWVyaWMoLikgLSAxKS8yKSkgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKCJ0YXZlc19zdWJqIikgJT4lCiAgc2VsZWN0KC1zdGFydHNfd2l0aCgidGF2ZXNfNTMiKSkKCmRfc2lnbmlmaWNhbmNlX251bSA8LSBkX3NpZ25pZmljYW5jZSAlPiUKICBzZWxlY3QoZW5kc193aXRoKCJfbnVtIikpCmBgYAoKIyBEZW1vZ3JhcGhpY3MKCiMjIyBTYW1wbGUgc2l6ZQoKYGBge3IsIHJlc3VsdHMgPSAiYXNpcyJ9CmQwICU+JSAKICBtdXRhdGVfYWxsKGZ1bnModG9sb3dlcikpICU+JQogIG11dGF0ZSh0YXZlc19jdHJ5ID0gZmFjdG9yKHRhdmVzX2N0cnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygidXMiLCAiZ2hhbmEiLCAidGhhaWxhbmQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGluYSIsICJ2YW51YXR1IikpKSAlPiUKICBjb3VudCh0YXZlc19jdHJ5KSAlPiUKICBrbml0cjo6a2FibGUoKSAlPiUgCiAga2FibGVFeHRyYTo6a2FibGVfc3R5bGluZygpCmBgYAoKIyMjIEdlbmRlcgoKYGBge3IsIHJlc3VsdHMgPSAiYXNpcyJ9CmQwICU+JSAKICBtdXRhdGVfYWxsKGZ1bnModG9sb3dlcikpICU+JQogIG11dGF0ZSh0YXZlc19jdHJ5ID0gZmFjdG9yKHRhdmVzX2N0cnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygidXMiLCAiZ2hhbmEiLCAidGhhaWxhbmQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGluYSIsICJ2YW51YXR1IikpKSAlPiUKICBjb3VudCh0YXZlc19jdHJ5LCB0YXZlc19kZW1vX3NleCkgJT4lCiAgZ3JvdXBfYnkodGF2ZXNfY3RyeSkgJT4lCiAgbXV0YXRlKHByb3AgPSBuL3N1bShuKSkgJT4lCiAgc2VsZWN0KC1uKSAlPiUKICBzcHJlYWQodGF2ZXNfZGVtb19zZXgsIHByb3ApICU+JQogIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGVfYXQodmFycygtdGF2ZXNfY3RyeSksIGZ1bnMocm91bmQoLiwgMikpKSAlPiUKICBrbml0cjo6a2FibGUoKSAlPiUgCiAga2FibGVFeHRyYTo6a2FibGVfc3R5bGluZygpCmBgYAoKCiMgTWFrZSBuZXcgZGF0YXNldAoKRmlyc3QsIEknbSBnb2luZyB0byBtYWtlIGEgbmV3IGRhdGFzZXQgd2hlcmUsIGZvciBlYWNoIHF1ZXN0aW9uLCB3ZSBoYXZlIHRoZSBwcm9wb3J0aW9uIG9mIHllcyByZXBvbnNlcyBmcm9tIGVhY2ggb2YgdGhlIGZpdmUgZmllbGQgc2l0ZXMuCgpgYGB7cn0KZF9wcmV2IDwtIGRfYmFzZV9udW0gJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJ0YXZlc19zdWJqIikgJT4lCiAgZ2F0aGVyKHF1ZXN0aW9uLCByZXNwb25zZSwgLXRhdmVzX3N1YmopICU+JQogIGxlZnRfam9pbihkMCAlPiUgZGlzdGluY3QodGF2ZXNfc3ViaiwgdGF2ZXNfY3RyeSkpICU+JQogIGdyb3VwX2J5KHRhdmVzX2N0cnksIHF1ZXN0aW9uKSAlPiUKICBzdW1tYXJpc2UocHJldiA9IG1lYW4ocmVzcG9uc2UsIG5hLnJtID0gVCkpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGUocXVlc3Rpb24gPSBnc3ViKCJfbnVtIiwgIiIsIHF1ZXN0aW9uKSkgJT4lCiAgbGVmdF9qb2luKHF1ZXN0aW9uX2tleSAlPiUKICAgICAgICAgICAgICByZW5hbWUocXVlc3Rpb24gPSBgVmFyaWFibGUgTmFtZSAtIFZFUlNJT04gMSAtLSBhbGwgdmFyaWFibGVzIGluIHZlcnNpb24yIGhhdmUgYmVlbiByZW5hbWVkIHRvIHJlZmxlY3QgdGhlc2UgdmFyYWlibGUgbmFtZXNgLAogICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbl90ZXh0ID0gYFF1ZXN0aW9uIC0gVkVSU0lPTiAxYCkpICU+JQogIHNlbGVjdCh0YXZlc19jdHJ5LCBxdWVzdGlvbiwgcXVlc3Rpb25fdGV4dCwgcHJldikgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uX3RleHQgPSBnc3ViKCJcciIsICIgIiwgcXVlc3Rpb25fdGV4dCksCiAgICAgICAgIHF1ZXN0aW9uX3RleHQgPSBnc3ViKCJcbiIsICIgIiwgcXVlc3Rpb25fdGV4dCksCiAgICAgICAgIHF1ZXN0aW9uX3RleHQgPSBnc3ViKCIgICIsICIgIiwgcXVlc3Rpb25fdGV4dCksCiAgICAgICAgIHF1ZXN0aW9uX3RleHQgPSBnc3ViKCLigJrDhMO0IiwgIiciLCBxdWVzdGlvbl90ZXh0KSwKICAgICAgICAgcXVlc3Rpb25fdGV4dCA9IGdzdWIoIuKAmsOEw7oiLCAiJyIsIHF1ZXN0aW9uX3RleHQpLAogICAgICAgICBxdWVzdGlvbl90ZXh0ID0gZ3N1Yigi4oCaw4TDuSIsICInIiwgcXVlc3Rpb25fdGV4dCksCiAgICAgICAgIHRhdmVzX2N0cnkgPSBmYWN0b3IodGF2ZXNfY3RyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJVUyIsICJHaGFuYSIsICJUaGFpbGFuZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoaW5hIiwgIlZhbnVhdHUiKSkpCgoKZF9wcmV2X3dpZGUgPC0gZF9wcmV2ICU+JQogIG11dGF0ZShxdWVzdGlvbiA9IGZhY3RvcihxdWVzdGlvbikpICU+JQogIGFycmFuZ2UocXVlc3Rpb24pICU+JQogIHNlbGVjdCgtcXVlc3Rpb24pICU+JQogIHNwcmVhZChxdWVzdGlvbl90ZXh0LCBwcmV2KSAlPiUKICBtdXRhdGUodGF2ZXNfY3RyeSA9IGFzLmNoYXJhY3Rlcih0YXZlc19jdHJ5KSkgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKCJ0YXZlc19jdHJ5IikKYGBgCgpIZXJlJ3MgYSBzYW1wbGUgb2Ygd2hhdCB0aGlzIG5ldyBkYXRhc2V0IGxvb2tzIGxpa2UgKDUgb2YgdGhlIDU5IGNvbHVtbnMpOgoKYGBge3IsIHJlc3VsdHMgPSAiYXNpcyJ9CmRfcHJldl93aWRlICU+JSAKICBzZWxlY3QoMjo2KSAlPiUgCiAgcm93bmFtZXNfdG9fY29sdW1uKCJTaXRlIikgJT4lIAogIGtuaXRyOjprYWJsZSgpICU+JSAKICBrYWJsZUV4dHJhOjprYWJsZV9zdHlsaW5nKCkKYGBgCgoKPFAgc3R5bGU9InBhZ2UtYnJlYWstYmVmb3JlOiBhbHdheXMiPgojIEhpZXJhcmNoaWNhbCBjbHVzdGVyaW5nCgpNeSBmaXJzdCBpbnN0aW5jdCB3YXMgdG8gdHJ5IGhpZXJhcmNoaWNhbCBjbHVzdGVyaW5nIG9uIHRoaXMgbmV3IGRhdGFzZXQuIEVhY2ggcXVlc3Rpb24gaXMgYXNzb2NpYXRlZCB3aXRoIDUgcHJldmFsZW5jZXMgKG9uZSBmb3IgZWFjaCBvZiBvdXIgNSBmaWVsZHNpdGVzKS4gSW4gdGhpcyBjbHVzdGVyIGFuYWx5c2lzLCB3ZSdyZSBsb29raW5nIGZvciBxdWVzdGlvbnMgdGhhdCBzaGFyZSBzaW1pbGFyIHBhdHRlcm5zIG9mIHByZXZhbGVuY2UgYWNyb3NzIHRoZSBmaWVsZHNpdGVzIC0gZS5nLiwgb25lIGNsdXN0ZXIgbWlnaHQgaWRlbnRpZnkgYSBzZXQgcXVlc3Rpb25zIHdoZXJlIHRoZSBwcmV2YWxlbmNlIGlzIHJvdWdobHkgdGhlIHNhbWUgYWNyb3NzIHRoZSA1IHNpdGVzOyBhbm90aGVyIGNsdXN0ZXIgbWlnaHQgaWRlbnRpZnkgYSBzZXQgb2YgcXVlc3Rpb25zIHdoZXJlIHRoZSBwcmV2YWxlbmNlIGlzIGhpZ2ggaW4gR2hhbmEgYW5kIFZhbnVhdHUgYnV0IGxvdyBldmVyeXdoZXJlIGVsc2U7IGV0Yy4gSSB0aGluayB0aGlzIGNhcHR1cmVzIHNvbWUgb2YgdGhlIHNwaXJpdCBvZiB3aGF0IEFubiB3YXMgYWZ0ZXIgdG9kYXkgKDEwLzgpLi4uIHRob3VnaCBtYXliZSBub3QgZXZlcnl0aGluZyAoZS5nLiwgaXQgbWlnaHQgbm90IGRpZmZlcmVudGlhdGUgYmV0d2VlbiBxdWVzdGlvbnMgd2hlcmUgcHJldmFsZW5jZSBpcyBoaWdoIGFjcm9zcyB0aGUgNSBzaXRlcyB2cy4gcXVlc3Rpb25zIHdoZXJlIHByZXZhbGVuY2UgaXMgbG93IGFjcm9zcyB0aGUgNSBzaXRlcykuCgpgYGB7cn0KaGNsdXN0X3ByZXYgPC0gZF9wcmV2X3dpZGUgJT4lIAogIHQoKSAlPiUgCiAgZGlzdChtZXRob2QgPSAiZXVjbGlkZWFuIikgJT4lICMgZGVmYXVsdCAKICBoY2x1c3QobWV0aG9kID0gImNvbXBsZXRlIikgIyBkZWZhdWx0CmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDgsIGZpZy5hc3AgPSAxfQpoY2x1c3RfcHJldiAlPiUgCiAgYXMuZGVuZHJvZ3JhbSgpICU+JSAKICBzZXQoImxhYmVsc19jb2wiLCBrID0gOSwgdmFsdWUgPSBjKCIjYTZjZWUzIiwgIiMxZjc4YjQiLCAiI2IyZGY4YSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIzMzYTAyYyIsICIjZmI5YTk5IiwgIiNlMzFhMWMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjZmRiZjZmIiwgIiNmZjdmMDAiLCAiI2NhYjJkNiIpKSAlPiUgCiAgcGxvdChob3JpeiA9IFQsIHhsaW0gPSBjKDEuNSwgLTEyKSwgYXhlcyA9IEYpCmBgYAoKQWZ0ZXIgc29tZSBwbGF5aW5nIGFyb3VuZCB3aXRoIHRoaXMsIEknbSBnb2luZyB0byBleHRyYWN0IDkgY2x1c3RlcnMgaGVyZSAtIEkndmUgY29sb3JlZCB0aGVtIGFjY29yZGluZyBzdWNoIGFib3ZlLiBUaGlzIGlzIGEgc3ViamVjdGl2ZSBjYWxsIC0geW91IGNvdWxkIGV4dHJhY3QgbW9yZSBvciBmZXdlci4gSSB0aGluayB0aGlzIHNlZW1zIGtpbmQgb2YgcmVhc29uYWJsZSBleWViYWxsaW5nIHRoZSBwbG90IGFib3ZlLgoKYGBge3J9CmhjbHVzdF9kZiA8LSBkYXRhLmZyYW1lKGNsdXN0ZXIgPSBjdXRyZWUoaGNsdXN0X3ByZXYsIDkpKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oInF1ZXN0aW9uX3RleHQiKSAlPiUKICBmdWxsX2pvaW4oZF9wcmV2KSAlPiUKICBsZWZ0X2pvaW4oZF9wcmV2ICU+JSAKICAgICAgICAgICAgICBmaWx0ZXIodGF2ZXNfY3RyeSA9PSAiVVMiKSAlPiUgCiAgICAgICAgICAgICAgZGlzdGluY3QocXVlc3Rpb24sIHByZXYpICU+JSAKICAgICAgICAgICAgICByZW5hbWUoIlVTX3ByZXYiID0gInByZXYiKSkgJT4lCiAgYXJyYW5nZShjbHVzdGVyLCBkZXNjKFVTX3ByZXYpLCB0YXZlc19jdHJ5KQpgYGAKCjxQIHN0eWxlPSJwYWdlLWJyZWFrLWJlZm9yZTogYWx3YXlzIj4KIyMgQ2x1c3RlciAxCgpIZXJlIEknbGwgcGxvdCB0aGUgcHJldmFsZW5jZSBvZiBlbmRvcnNlbWVudHMgaW4gZWFjaCBzaXRlIGZvciBlYWNoIG9mIHRoZSBxdWVzdGlvbnMgaW4gQ2x1c3RlciAxLiAoTm90ZSB0aGF0IHRoZSBvcmRlciBvZiBjbHVzdGVycyBkb2Vzbid0IGFsaWduIHdpdGggdGhlIHRvcCB0byBib3R0b20gb3JkZXIgb2YgdGhlIHByZXZpb3VzIHBsb3QgLSBzb3JyeSBpZiB0aGF0J3MgY29uZnVzaW5nLCBpdCdzIGp1c3QgYW4gYXJ0aWZhY3Qgb2YgaG93IHRoZSBwcmV2aW91cyBwbG90IHdvcmtlZC4gTm90IHZlcnkgbWVhbmluZ2Z1bC4gVGhpcyBpcyB0aGUgbGlnaHQgb3JhbmdlIGNsdXN0ZXIgYWJvdmUuKQoKSSdsbCBwbG90IHRoZXNlIHF1ZXN0aW9ucyBpbiBkZXNjZW5kaW5nIG9yZGVyIG9mIHRoZWlyIHByZXZhbGVuY2UgaW4gdGhlIFVTIHNhbXBsZSwganVzdCBhcyBhIHBvaW50IG9mIHJlZmVyZW5jZS4KCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMX0KaGNsdXN0X2RmICU+JQogIGZpbHRlcihjbHVzdGVyID09IDEpICU+JQogIG11dGF0ZShxdWVzdGlvbl90ZXh0ID0gZ3N1YignKC57MSw0MH0pKFxcc3wkKScsICdcXDFcbicsIHF1ZXN0aW9uX3RleHQpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKHF1ZXN0aW9uX3RleHQsIFVTX3ByZXYpLCB5ID0gcHJldiwKICAgICAgICAgICAgIGZpbGwgPSB0YXZlc19jdHJ5LCBjb2xvciA9IHRhdmVzX2N0cnkpKSArCiAgZmFjZXRfZ3JpZCh+IHRhdmVzX2N0cnksIHNjYWxlcyA9ICJmcmVlIikgKwogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC41LCBsdHkgPSAyKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImlkZW50aXR5Iiwgc2l6ZSA9IDEsIGFscGhhID0gMC41KSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIsIGd1aWRlID0gIm5vbmUiKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiLCBndWlkZSA9ICJub25lIikgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDEpLCBicmVha3MgPSBzZXEoMCwgMSwgMC41KSkgKwogIGxhYnModGl0bGUgPSAiQ2x1c3RlcjogMSIsCiAgICAgICB4ID0gIiIsIHkgPSAicHJvcG9ydGlvbiBzYXlpbmcgWUVTIikgKwogIHRoZW1lX2J3KCkgKwogIGNvb3JkX2ZsaXAoKQpgYGAKCkl0IGxvb2tzIGxpa2UgdGhlIHByZXZhbGVuY2UgcGF0dGVybiBoZXJlIGlzIGxvdyBpbiB0aGUgVVMgYW5kIFRoYWlsYW5kICh+MjUlKSwgc2xpZ2h0bHkgaGlnaGVyIGluIENoaW5hIChidXQgdW5kZXIgNTAlKSwgYW5kIGhpZ2hlciBpbiBHaGFuYSBhbmQgVmFudWF0dSAoZ2VuZXJhbGx5IG92ZXIgNTAlKS4KCkkgd29uJ3QgdHJ5IHRvIGludGVycHJldCB0aGUgbWVhbmluZyBvZiB0aGVzZSBxdWVzdGlvbnMgcmlnaHQgbm93LgoKCjxQIHN0eWxlPSJwYWdlLWJyZWFrLWJlZm9yZTogYWx3YXlzIj4KIyMgQ2x1c3RlciAyCgpOb3cgSSdsbCBwbG90IHRoZSBwcmV2YWxlbmNlIG9mIGVuZG9yc2VtZW50cyBpbiBlYWNoIHNpdGUgZm9yIGVhY2ggb2YgdGhlIHF1ZXN0aW9ucyBpbiBDbHVzdGVyIDIgKHRoZSBwaW5rIGNsdXN0ZXIgaW4gdGhlIG92ZXJhbGwgcGxvdCkuCgpBZ2FpbiwgSSdsbCBwbG90IHRoZXNlIHF1ZXN0aW9ucyBpbiBkZXNjZW5kaW5nIG9yZGVyIG9mIHRoZWlyIHByZXZhbGVuY2UgaW4gdGhlIFVTIHNhbXBsZSwganVzdCBhcyBhIHBvaW50IG9mIHJlZmVyZW5jZS4KCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC41fQpoY2x1c3RfZGYgJT4lCiAgZmlsdGVyKGNsdXN0ZXIgPT0gMikgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uX3RleHQgPSBnc3ViKCcoLnsxLDQwfSkoXFxzfCQpJywgJ1xcMVxuJywgcXVlc3Rpb25fdGV4dCkpICU+JQogIGdncGxvdChhZXMoeCA9IHJlb3JkZXIocXVlc3Rpb25fdGV4dCwgVVNfcHJldiksIHkgPSBwcmV2LAogICAgICAgICAgICAgZmlsbCA9IHRhdmVzX2N0cnksIGNvbG9yID0gdGF2ZXNfY3RyeSkpICsKICBmYWNldF9ncmlkKH4gdGF2ZXNfY3RyeSwgc2NhbGVzID0gImZyZWUiKSArCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjUsIGx0eSA9IDIpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiaWRlbnRpdHkiLCBzaXplID0gMSwgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIiwgZ3VpZGUgPSAibm9uZSIpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIsIGd1aWRlID0gIm5vbmUiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMSksIGJyZWFrcyA9IHNlcSgwLCAxLCAwLjUpKSArCiAgbGFicyh0aXRsZSA9ICJDbHVzdGVyOiAyIiwKICAgICAgIHggPSAiIiwgeSA9ICJwcm9wb3J0aW9uIHNheWluZyBZRVMiKSArCiAgdGhlbWVfYncoKSArCiAgY29vcmRfZmxpcCgpCmBgYAoKSXQgbG9va3MgbGlrZSB0aGUgcHJldmFsZW5jZSBwYXR0ZXJuIGhlcmUgaXMgc29tZXRoaW5nIGxpa2UgdmVyeSBsb3cgaW4gdGhlIFVTIChnZW5lcmFsbHkgPCAxMCUpLCBwcmV0dHkgbG93IGluIFRoYWlsYW5kIGFuZCBDaGluYSAoZ2VuZXJhbGx5IDwgMjUlKSwgbWlkZGxpbmcgaW4gR2hhbmEgKGFyb3VuZCAyNSUpLCBhbmQgbW9kZXJhdGUgaW4gVmFudWF0dSAodW5kZXIgNTAlKS4gQnV0IHRoZXJlIGFyZSBzb21lIGV4Y2VwdGlvbnMgaGVyZSAtIGUuZy4sICMyNiAod2hlcmUgVGhhaWxhbmQgaXMgaGlnaGVzdCk7ICM0NyBhbmQgIzM5ICh3aGVyZSBhbGwgc2l0ZXMgYXJlIGNvbXBhcmFibGUpOyAjNTEgKHdoZXJlIEdoYW5hLCBUaGFpbGFuZCwgYW5kIENoaW5hIGFyZSBhbGwgY29tcGFyYWJsZSkuIEkgd291bGQgc2F5IHRoYXQgdGhlc2UgcXVlc3Rpb25zIGFyZSBsZXNzIGdvb2QgZXhhbXBsZXMgb2YgdGhpcyAiY2x1c3Rlci4iCgoKPFAgc3R5bGU9InBhZ2UtYnJlYWstYmVmb3JlOiBhbHdheXMiPgojIyBDbHVzdGVyIDMKCk5vdyBJJ2xsIHBsb3QgdGhlIHByZXZhbGVuY2Ugb2YgZW5kb3JzZW1lbnRzIGluIGVhY2ggc2l0ZSBmb3IgZWFjaCBvZiB0aGUgcXVlc3Rpb25zIGluIENsdXN0ZXIgMyAodGhlIGRhcmsgcmVkIGNsdXN0ZXIgaW4gdGhlIG92ZXJhbGwgcGxvdCkuCgpBZ2FpbiwgSSdsbCBwbG90IHRoZXNlIHF1ZXN0aW9ucyBpbiBkZXNjZW5kaW5nIG9yZGVyIG9mIHRoZWlyIHByZXZhbGVuY2UgaW4gdGhlIFVTIHNhbXBsZSwganVzdCBhcyBhIHBvaW50IG9mIHJlZmVyZW5jZS4KCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC43fQpoY2x1c3RfZGYgJT4lCiAgZmlsdGVyKGNsdXN0ZXIgPT0gMykgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uX3RleHQgPSBnc3ViKCcoLnsxLDQwfSkoXFxzfCQpJywgJ1xcMVxuJywgcXVlc3Rpb25fdGV4dCkpICU+JQogIGdncGxvdChhZXMoeCA9IHJlb3JkZXIocXVlc3Rpb25fdGV4dCwgVVNfcHJldiksIHkgPSBwcmV2LAogICAgICAgICAgICAgZmlsbCA9IHRhdmVzX2N0cnksIGNvbG9yID0gdGF2ZXNfY3RyeSkpICsKICBmYWNldF9ncmlkKH4gdGF2ZXNfY3RyeSwgc2NhbGVzID0gImZyZWUiKSArCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjUsIGx0eSA9IDIpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiaWRlbnRpdHkiLCBzaXplID0gMSwgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIiwgZ3VpZGUgPSAibm9uZSIpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIsIGd1aWRlID0gIm5vbmUiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMSksIGJyZWFrcyA9IHNlcSgwLCAxLCAwLjUpKSArCiAgbGFicyh0aXRsZSA9ICJDbHVzdGVyOiAzIiwKICAgICAgIHggPSAiIiwgeSA9ICJwcm9wb3J0aW9uIHNheWluZyBZRVMiKSArCiAgdGhlbWVfYncoKSArCiAgY29vcmRfZmxpcCgpCmBgYAoKSXQgbG9va3MgbGlrZSB0aGUgcHJldmFsZW5jZSBwYXR0ZXJuIGhlcmUgaXMgZ2VuZXJhbGx5IGxvdyAofjI1JSkgYWNyb3NzIHRoZSBib2FyZCwgYnV0IHNsaWdodGx5IGhpZ2hlciBpbiBHaGFuYSBhbmQgVmFudWF0dSAoY2xvc2VyIHRvIDQwJSkuCgoKPFAgc3R5bGU9InBhZ2UtYnJlYWstYmVmb3JlOiBhbHdheXMiPgojIyBDbHVzdGVyIDQKCk5vdyBJJ2xsIHBsb3QgdGhlIHByZXZhbGVuY2Ugb2YgZW5kb3JzZW1lbnRzIGluIGVhY2ggc2l0ZSBmb3IgZWFjaCBvZiB0aGUgcXVlc3Rpb25zIGluIENsdXN0ZXIgNCAodGhlIGxpZ2h0IGJsdWUgY2x1c3RlciBpbiB0aGUgb3ZlcmFsbCBwbG90KS4KCkFnYWluLCBJJ2xsIHBsb3QgdGhlc2UgcXVlc3Rpb25zIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgdGhlaXIgcHJldmFsZW5jZSBpbiB0aGUgVVMgc2FtcGxlLCBqdXN0IGFzIGEgcG9pbnQgb2YgcmVmZXJlbmNlLgoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjN9CmhjbHVzdF9kZiAlPiUKICBmaWx0ZXIoY2x1c3RlciA9PSA0KSAlPiUKICBtdXRhdGUocXVlc3Rpb25fdGV4dCA9IGdzdWIoJyguezEsNDB9KShcXHN8JCknLCAnXFwxXG4nLCBxdWVzdGlvbl90ZXh0KSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihxdWVzdGlvbl90ZXh0LCBVU19wcmV2KSwgeSA9IHByZXYsCiAgICAgICAgICAgICBmaWxsID0gdGF2ZXNfY3RyeSwgY29sb3IgPSB0YXZlc19jdHJ5KSkgKwogIGZhY2V0X2dyaWQofiB0YXZlc19jdHJ5LCBzY2FsZXMgPSAiZnJlZSIpICsKICAjIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAuNSwgbHR5ID0gMikgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJpZGVudGl0eSIsIHNpemUgPSAxLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiLCBndWlkZSA9ICJub25lIikgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIiwgZ3VpZGUgPSAibm9uZSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAxKSwgYnJlYWtzID0gc2VxKDAsIDEsIDAuNSkpICsKICBsYWJzKHRpdGxlID0gIkNsdXN0ZXI6IDQiLAogICAgICAgeCA9ICIiLCB5ID0gInByb3BvcnRpb24gc2F5aW5nIFlFUyIpICsKICB0aGVtZV9idygpICsKICBjb29yZF9mbGlwKCkKYGBgCgpJdCBsb29rcyBsaWtlIHRoZSBwcmV2YWxlbmNlIHBhdHRlcm4gaGVyZSBpcyBnZW5lcmFsbHkgY29tcGFyYWJsZSBhbmQgcHJldHR5IGhpZ2ggKH43NSUpIGFjcm9zcyB0aGUgYm9hcmQsIGVzcGVjaWFsbHkgaW4gQ2hpbmEgYW5kIFRoYWlsYW5kLgoKCjxQIHN0eWxlPSJwYWdlLWJyZWFrLWJlZm9yZTogYWx3YXlzIj4KIyMgQ2x1c3RlciA1CgpOb3cgSSdsbCBwbG90IHRoZSBwcmV2YWxlbmNlIG9mIGVuZG9yc2VtZW50cyBpbiBlYWNoIHNpdGUgZm9yIGVhY2ggb2YgdGhlIHF1ZXN0aW9ucyBpbiBDbHVzdGVyIDUgKHRoZSBkYXJrIG9yYW5nZSBjbHVzdGVyIGluIHRoZSBvdmVyYWxsIHBsb3QpLgoKQWdhaW4sIEknbGwgcGxvdCB0aGVzZSBxdWVzdGlvbnMgaW4gZGVzY2VuZGluZyBvcmRlciBvZiB0aGVpciBwcmV2YWxlbmNlIGluIHRoZSBVUyBzYW1wbGUsIGp1c3QgYXMgYSBwb2ludCBvZiByZWZlcmVuY2UuCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDAuNn0KaGNsdXN0X2RmICU+JQogIGZpbHRlcihjbHVzdGVyID09IDUpICU+JQogIG11dGF0ZShxdWVzdGlvbl90ZXh0ID0gZ3N1YignKC57MSw0MH0pKFxcc3wkKScsICdcXDFcbicsIHF1ZXN0aW9uX3RleHQpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKHF1ZXN0aW9uX3RleHQsIFVTX3ByZXYpLCB5ID0gcHJldiwKICAgICAgICAgICAgIGZpbGwgPSB0YXZlc19jdHJ5LCBjb2xvciA9IHRhdmVzX2N0cnkpKSArCiAgZmFjZXRfZ3JpZCh+IHRhdmVzX2N0cnksIHNjYWxlcyA9ICJmcmVlIikgKwogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC41LCBsdHkgPSAyKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImlkZW50aXR5Iiwgc2l6ZSA9IDEsIGFscGhhID0gMC41KSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIsIGd1aWRlID0gIm5vbmUiKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiLCBndWlkZSA9ICJub25lIikgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDEpLCBicmVha3MgPSBzZXEoMCwgMSwgMC41KSkgKwogIGxhYnModGl0bGUgPSAiQ2x1c3RlcjogNSIsCiAgICAgICB4ID0gIiIsIHkgPSAicHJvcG9ydGlvbiBzYXlpbmcgWUVTIikgKwogIHRoZW1lX2J3KCkgKwogIGNvb3JkX2ZsaXAoKQpgYGAKCkl0IGxvb2tzIGxpa2UgdGhlIHByZXZhbGVuY2UgcGF0dGVybiBoZXJlIGlzIGdlbmVyYWxseSBjb21wYXJhYmxlIGFuZCBtb2RlcmF0ZSAofjI1JSkgYWNyb3NzIHRoZSBib2FyZCwgYnV0IGhpZ2hlciBpbiBHaGFuYSBhbmQgVmFudWF0dSAoY2xvc2VyIHRvIDUwJSkuCgoKPFAgc3R5bGU9InBhZ2UtYnJlYWstYmVmb3JlOiBhbHdheXMiPgojIyBDbHVzdGVyIDYKCk5vdyBJJ2xsIHBsb3QgdGhlIHByZXZhbGVuY2Ugb2YgZW5kb3JzZW1lbnRzIGluIGVhY2ggc2l0ZSBmb3IgZWFjaCBvZiB0aGUgcXVlc3Rpb25zIGluIENsdXN0ZXIgNiAodGhlIGRhcmsgZ3JlZW4gY2x1c3RlciBpbiB0aGUgb3ZlcmFsbCBwbG90KS4KCkFnYWluLCBJJ2xsIHBsb3QgdGhlc2UgcXVlc3Rpb25zIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgdGhlaXIgcHJldmFsZW5jZSBpbiB0aGUgVVMgc2FtcGxlLCBqdXN0IGFzIGEgcG9pbnQgb2YgcmVmZXJlbmNlLgoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjN9CmhjbHVzdF9kZiAlPiUKICBmaWx0ZXIoY2x1c3RlciA9PSA2KSAlPiUKICBtdXRhdGUocXVlc3Rpb25fdGV4dCA9IGdzdWIoJyguezEsNDB9KShcXHN8JCknLCAnXFwxXG4nLCBxdWVzdGlvbl90ZXh0KSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihxdWVzdGlvbl90ZXh0LCBVU19wcmV2KSwgeSA9IHByZXYsCiAgICAgICAgICAgICBmaWxsID0gdGF2ZXNfY3RyeSwgY29sb3IgPSB0YXZlc19jdHJ5KSkgKwogIGZhY2V0X2dyaWQofiB0YXZlc19jdHJ5LCBzY2FsZXMgPSAiZnJlZSIpICsKICAjIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAuNSwgbHR5ID0gMikgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJpZGVudGl0eSIsIHNpemUgPSAxLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiLCBndWlkZSA9ICJub25lIikgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIiwgZ3VpZGUgPSAibm9uZSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAxKSwgYnJlYWtzID0gc2VxKDAsIDEsIDAuNSkpICsKICBsYWJzKHRpdGxlID0gIkNsdXN0ZXI6IDYiLAogICAgICAgeCA9ICIiLCB5ID0gInByb3BvcnRpb24gc2F5aW5nIFlFUyIpICsKICB0aGVtZV9idygpICsKICBjb29yZF9mbGlwKCkKYGBgCgpJdCBsb29rcyBsaWtlIHRoZSBwcmV2YWxlbmNlIHBhdHRlcm4gaGVyZSBpcyBnZW5lcmFsbHkgY29tcGFyYWJsZSBhbmQgbW9kZXJhdGUgKH4yNSUpIGluIHRoZSBVUyBhbmQgVGhhaWxhbmQsIGJ1dCBoaWdoZXIgaW4gR2hhbmEsIENoaW5hLCBhbmQgZXNwZWNpYWxseSBWYW51YXR1ICg+NTAlKS4KCgo8UCBzdHlsZT0icGFnZS1icmVhay1iZWZvcmU6IGFsd2F5cyI+CiMjIENsdXN0ZXIgNwoKTm93IEknbGwgcGxvdCB0aGUgcHJldmFsZW5jZSBvZiBlbmRvcnNlbWVudHMgaW4gZWFjaCBzaXRlIGZvciBlYWNoIG9mIHRoZSBxdWVzdGlvbnMgaW4gQ2x1c3RlciA3ICh0aGUgZGFyayBibHVlIGNsdXN0ZXIgaW4gdGhlIG92ZXJhbGwgcGxvdCkuCgpBZ2FpbiwgSSdsbCBwbG90IHRoZXNlIHF1ZXN0aW9ucyBpbiBkZXNjZW5kaW5nIG9yZGVyIG9mIHRoZWlyIHByZXZhbGVuY2UgaW4gdGhlIFVTIHNhbXBsZSwganVzdCBhcyBhIHBvaW50IG9mIHJlZmVyZW5jZS4KCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC43fQpoY2x1c3RfZGYgJT4lCiAgZmlsdGVyKGNsdXN0ZXIgPT0gNykgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uX3RleHQgPSBnc3ViKCcoLnsxLDQwfSkoXFxzfCQpJywgJ1xcMVxuJywgcXVlc3Rpb25fdGV4dCkpICU+JQogIGdncGxvdChhZXMoeCA9IHJlb3JkZXIocXVlc3Rpb25fdGV4dCwgVVNfcHJldiksIHkgPSBwcmV2LAogICAgICAgICAgICAgZmlsbCA9IHRhdmVzX2N0cnksIGNvbG9yID0gdGF2ZXNfY3RyeSkpICsKICBmYWNldF9ncmlkKH4gdGF2ZXNfY3RyeSwgc2NhbGVzID0gImZyZWUiKSArCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjUsIGx0eSA9IDIpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiaWRlbnRpdHkiLCBzaXplID0gMSwgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIiwgZ3VpZGUgPSAibm9uZSIpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIsIGd1aWRlID0gIm5vbmUiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMSksIGJyZWFrcyA9IHNlcSgwLCAxLCAwLjUpKSArCiAgbGFicyh0aXRsZSA9ICJDbHVzdGVyOiA3IiwKICAgICAgIHggPSAiIiwgeSA9ICJwcm9wb3J0aW9uIHNheWluZyBZRVMiKSArCiAgdGhlbWVfYncoKSArCiAgY29vcmRfZmxpcCgpCmBgYAoKSXQgbG9va3MgbGlrZSB0aGUgcHJldmFsZW5jZSBwYXR0ZXJuIGhlcmUgaXMgZ2VuZXJhbGx5IG1vZGVyYXRlICh+MjUlKSBpbiB0aGUgVVMgYW5kIFRoYWlsYW5kLCBoaWdoZXIgaW4gR2hhbmEgYW5kIFZhbnVhdHUgKH41MCUpLCBhbmQgZXNwZWNpYWxseSBoaWdoIGluIENoaW5hICh+NjAlKS4KCgo8UCBzdHlsZT0icGFnZS1icmVhay1iZWZvcmU6IGFsd2F5cyI+CiMjIENsdXN0ZXIgOAoKTm93IEknbGwgcGxvdCB0aGUgcHJldmFsZW5jZSBvZiBlbmRvcnNlbWVudHMgaW4gZWFjaCBzaXRlIGZvciBlYWNoIG9mIHRoZSBxdWVzdGlvbnMgaW4gQ2x1c3RlciA4ICh0aGUgbGlnaHQgcHVycGxlIGNsdXN0ZXIgaW4gdGhlIG92ZXJhbGwgcGxvdCkuCgpBZ2FpbiwgSSdsbCBwbG90IHRoZXNlIHF1ZXN0aW9ucyBpbiBkZXNjZW5kaW5nIG9yZGVyIG9mIHRoZWlyIHByZXZhbGVuY2UgaW4gdGhlIFVTIHNhbXBsZSwganVzdCBhcyBhIHBvaW50IG9mIHJlZmVyZW5jZS4KCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC43fQpoY2x1c3RfZGYgJT4lCiAgZmlsdGVyKGNsdXN0ZXIgPT0gOCkgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uX3RleHQgPSBnc3ViKCcoLnsxLDQwfSkoXFxzfCQpJywgJ1xcMVxuJywgcXVlc3Rpb25fdGV4dCkpICU+JQogIGdncGxvdChhZXMoeCA9IHJlb3JkZXIocXVlc3Rpb25fdGV4dCwgVVNfcHJldiksIHkgPSBwcmV2LAogICAgICAgICAgICAgZmlsbCA9IHRhdmVzX2N0cnksIGNvbG9yID0gdGF2ZXNfY3RyeSkpICsKICBmYWNldF9ncmlkKH4gdGF2ZXNfY3RyeSwgc2NhbGVzID0gImZyZWUiKSArCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjUsIGx0eSA9IDIpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiaWRlbnRpdHkiLCBzaXplID0gMSwgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIiwgZ3VpZGUgPSAibm9uZSIpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIsIGd1aWRlID0gIm5vbmUiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMSksIGJyZWFrcyA9IHNlcSgwLCAxLCAwLjUpKSArCiAgbGFicyh0aXRsZSA9ICJDbHVzdGVyOiA4IiwKICAgICAgIHggPSAiIiwgeSA9ICJwcm9wb3J0aW9uIHNheWluZyBZRVMiKSArCiAgdGhlbWVfYncoKSArCiAgY29vcmRfZmxpcCgpCmBgYAoKSXQgbG9va3MgbGlrZSB0aGUgcHJldmFsZW5jZSBwYXR0ZXJuIGhlcmUgaXMgZ2VuZXJhbGx5IG1vZGVyYXRlICh+MjUlKSBhY3Jvc3MgdGhlIGJvYXJkLCBtYXliZSBhIGxpdHRsZSBoaWdoZXIgaW4gQ2hpbmEgYW5kIFZhbnVhdHUgKGNsb3NlciB0byA0MCUpLgoKCjxQIHN0eWxlPSJwYWdlLWJyZWFrLWJlZm9yZTogYWx3YXlzIj4KIyMgQ2x1c3RlciA5CgpOb3cgSSdsbCBwbG90IHRoZSBwcmV2YWxlbmNlIG9mIGVuZG9yc2VtZW50cyBpbiBlYWNoIHNpdGUgZm9yIGVhY2ggb2YgdGhlIHF1ZXN0aW9ucyBpbiBDbHVzdGVyIDkgKHRoZSBsaWdodCBncmVlbiBjbHVzdGVyIGluIHRoZSBvdmVyYWxsIHBsb3QpLgoKQWdhaW4sIEknbGwgcGxvdCB0aGVzZSBxdWVzdGlvbnMgaW4gZGVzY2VuZGluZyBvcmRlciBvZiB0aGVpciBwcmV2YWxlbmNlIGluIHRoZSBVUyBzYW1wbGUsIGp1c3QgYXMgYSBwb2ludCBvZiByZWZlcmVuY2UuCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDAuNH0KaGNsdXN0X2RmICU+JQogIGZpbHRlcihjbHVzdGVyID09IDkpICU+JQogIG11dGF0ZShxdWVzdGlvbl90ZXh0ID0gZ3N1YignKC57MSw0MH0pKFxcc3wkKScsICdcXDFcbicsIHF1ZXN0aW9uX3RleHQpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKHF1ZXN0aW9uX3RleHQsIFVTX3ByZXYpLCB5ID0gcHJldiwKICAgICAgICAgICAgIGZpbGwgPSB0YXZlc19jdHJ5LCBjb2xvciA9IHRhdmVzX2N0cnkpKSArCiAgZmFjZXRfZ3JpZCh+IHRhdmVzX2N0cnksIHNjYWxlcyA9ICJmcmVlIikgKwogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC41LCBsdHkgPSAyKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImlkZW50aXR5Iiwgc2l6ZSA9IDEsIGFscGhhID0gMC41KSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIsIGd1aWRlID0gIm5vbmUiKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiLCBndWlkZSA9ICJub25lIikgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDEpLCBicmVha3MgPSBzZXEoMCwgMSwgMC41KSkgKwogIGxhYnModGl0bGUgPSAiQ2x1c3RlcjogOSIsCiAgICAgICB4ID0gIiIsIHkgPSAicHJvcG9ydGlvbiBzYXlpbmcgWUVTIikgKwogIHRoZW1lX2J3KCkgKwogIGNvb3JkX2ZsaXAoKQpgYGAKCkl0IGxvb2tzIGxpa2UgdGhlIHByZXZhbGVuY2UgcGF0dGVybiBoZXJlIGlzIGdlbmVyYWxseSBoaWdoICh+NTAlKSBhY3Jvc3MgdGhlIGJvYXJkLCBhbmQgZXNwY2lhbGx5IGluIENoaW5hIChjbG9zZXIgdG8gNzAlKS4KCgojIEhpZXJhcmNoaWNhbCBjbHVzdGVyaW5nIHByZXRlbmRpbmcgd2Ugb25seSBoYWQgMiBzaXRlcyAoVVMgYW5kIEdoYW5hKQoKSGVyZSBJIHdpbGwgdHJ5IHRvIGFwcHJveGltYXRlIHdoYXQgaXQgd291bGQgYmUgbGlrZSB0byBkbyB0aGlzIGFuYWx5c2lzIHdpdGggb25seSAyIHNpdGVzLCB0byBnaXZlIGEgc2Vuc2Ugb2Ygd2hldGhlciB0aGlzIHdvdWxkIG1ha2Ugc2Vuc2UgZm9yIHRoZSAxLjAgZGF0YS4gSSdsbCBsaW1pdCB0aGUgZGF0YSB0byBvbmx5IDIgc2l0ZXMgKFVTIGFuZCBHaGFuYSkgYW5kIGRvIGV2ZXJ5dGhpbmcgSSBkaWQgYmVmb3JlLgoKYGBge3J9CmhjbHVzdF9wcmV2MiA8LSBkX3ByZXZfd2lkZSAlPiUgCiAgcm93bmFtZXNfdG9fY29sdW1uKCJ0YXZlc19jdHJ5IikgJT4lCiAgZmlsdGVyKHRhdmVzX2N0cnkgJWluJSBjKCJVUyIsICJHaGFuYSIpKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXMoInRhdmVzX2N0cnkiKSAlPiUKICB0KCkgJT4lIAogIGRpc3QoKSAlPiUgCiAgaGNsdXN0KCkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gOCwgZmlnLmFzcCA9IDF9CmhjbHVzdF9wcmV2MiAlPiUgCiAgYXMuZGVuZHJvZ3JhbSgpICU+JSAKICBzZXQoImxhYmVsc19jb2wiLCBrID0gOCwgdmFsdWUgPSBjKCIjYTZjZWUzIiwgIiMxZjc4YjQiLCAiI2IyZGY4YSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIzMzYTAyYyIsICIjZmI5YTk5IiwgIiNlMzFhMWMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjZmRiZjZmIiwgIiNmZjdmMDAiLCAiI2NhYjJkNiIpKSAlPiUgCiAgcGxvdChob3JpeiA9IFQsIHhsaW0gPSBjKDEuNSwgLTEyKSwgYXhlcyA9IEYpCmBgYAoKSGVyZSwgOCBzZWVtcyBsaWtlIGEgcmVhc29uYWJsZSBudW1iZXIgb2YgY2x1c3RlcnMgdG8gbG9vayBhdC4gSSB3aXNoIHRoYXQgdGhlIGxpZ2h0IG9yYW5nZSBjbHVzdGVyIHdlcmVuJ3QgYSBjbHVzdGVyIG9mIDEsIGJ1dCBpdCByZXF1aXJlcyBnb2luZyBkb3duIHRvIGp1c3QgNSBjbHVzdGVycyB0byBnZXQgdGhlcmUsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIG90aGVyIGNsdXN0ZXJzIGdldCBxdWl0ZSBsYXJnZS4KCmBgYHtyfQpoY2x1c3RfZGYyIDwtIGRhdGEuZnJhbWUoY2x1c3RlciA9IGN1dHJlZShoY2x1c3RfcHJldjIsIDgpKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oInF1ZXN0aW9uX3RleHQiKSAlPiUKICBmdWxsX2pvaW4oZF9wcmV2ICU+JSBmaWx0ZXIodGF2ZXNfY3RyeSAlaW4lIGMoIlVTIiwgIkdoYW5hIikpKSAlPiUKICBsZWZ0X2pvaW4oZF9wcmV2ICU+JSAKICAgICAgICAgICAgICBmaWx0ZXIodGF2ZXNfY3RyeSA9PSAiVVMiKSAlPiUgCiAgICAgICAgICAgICAgZGlzdGluY3QocXVlc3Rpb24sIHByZXYpICU+JSAKICAgICAgICAgICAgICByZW5hbWUoIlVTX3ByZXYiID0gInByZXYiKSkgJT4lCiAgYXJyYW5nZShjbHVzdGVyLCBkZXNjKFVTX3ByZXYpLCB0YXZlc19jdHJ5KQpgYGAKCiMjIENsdXN0ZXIgMQoKRm9sbG93aW5nIHRoZSA1LXNpdGUgYW5hbHlzaXMgYWJvdmUsIGhlcmUgSSdsbCBwbG90IHRoZSBwcmV2YWxlbmNlIG9mIGVuZG9yc2VtZW50cyBpbiBlYWNoIHNpdGUgZm9yIGVhY2ggb2YgdGhlIHF1ZXN0aW9ucyBpbiBDbHVzdGVyIDEuIChUaGlzIGlzIHRoZSBwaW5rIGNsdXN0ZXIgYWJvdmUuKQoKSSdsbCBwbG90IHRoZXNlIHF1ZXN0aW9ucyBpbiBkZXNjZW5kaW5nIG9yZGVyIG9mIHRoZWlyIHByZXZhbGVuY2UgaW4gdGhlIFVTIHNhbXBsZSwganVzdCBhcyBhIHBvaW50IG9mIHJlZmVyZW5jZS4KCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMX0KaGNsdXN0X2RmMiAlPiUKICBmaWx0ZXIoY2x1c3RlciA9PSAxKSAlPiUKICBtdXRhdGUocXVlc3Rpb25fdGV4dCA9IGdzdWIoJyguezEsNDB9KShcXHN8JCknLCAnXFwxXG4nLCBxdWVzdGlvbl90ZXh0KSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihxdWVzdGlvbl90ZXh0LCBVU19wcmV2KSwgeSA9IHByZXYsCiAgICAgICAgICAgICBmaWxsID0gdGF2ZXNfY3RyeSwgY29sb3IgPSB0YXZlc19jdHJ5KSkgKwogIGZhY2V0X2dyaWQofiB0YXZlc19jdHJ5LCBzY2FsZXMgPSAiZnJlZSIpICsKICAjIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAuNSwgbHR5ID0gMikgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJpZGVudGl0eSIsIHNpemUgPSAxLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiLCBndWlkZSA9ICJub25lIikgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIiwgZ3VpZGUgPSAibm9uZSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAxKSwgYnJlYWtzID0gc2VxKDAsIDEsIDAuNSkpICsKICBsYWJzKHRpdGxlID0gIkNsdXN0ZXI6IDEiLAogICAgICAgeCA9ICIiLCB5ID0gInByb3BvcnRpb24gc2F5aW5nIFlFUyIpICsKICB0aGVtZV9idygpICsKICBjb29yZF9mbGlwKCkKYGBgCgpJdCBsb29rcyBsaWtlIHRoZSBwcmV2YWxlbmNlIHBhdHRlcm4gaGVyZSBpcyBtb2RlcmF0ZSBpbiB0aGUgVVMgKD4yNSUpIGFuZCBoaWdoZXIgaW4gR2hhbmEgKGNsb3NlIHRvIDUwJSkuCgoKPFAgc3R5bGU9InBhZ2UtYnJlYWstYmVmb3JlOiBhbHdheXMiPgojIyBDbHVzdGVyIDIKCk5vdyBJJ2xsIHBsb3QgdGhlIHByZXZhbGVuY2Ugb2YgZW5kb3JzZW1lbnRzIGluIGVhY2ggc2l0ZSBmb3IgZWFjaCBvZiB0aGUgcXVlc3Rpb25zIGluIENsdXN0ZXIgMiAodGhlIGxpZ2h0IGdyZWVuIGNsdXN0ZXIgaW4gdGhlIG92ZXJhbGwgcGxvdCkuCgpBZ2FpbiwgSSdsbCBwbG90IHRoZXNlIHF1ZXN0aW9ucyBpbiBkZXNjZW5kaW5nIG9yZGVyIG9mIHRoZWlyIHByZXZhbGVuY2UgaW4gdGhlIFVTIHNhbXBsZSwganVzdCBhcyBhIHBvaW50IG9mIHJlZmVyZW5jZS4KCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC41fQpoY2x1c3RfZGYyICU+JQogIGZpbHRlcihjbHVzdGVyID09IDIpICU+JQogIG11dGF0ZShxdWVzdGlvbl90ZXh0ID0gZ3N1YignKC57MSw0MH0pKFxcc3wkKScsICdcXDFcbicsIHF1ZXN0aW9uX3RleHQpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKHF1ZXN0aW9uX3RleHQsIFVTX3ByZXYpLCB5ID0gcHJldiwKICAgICAgICAgICAgIGZpbGwgPSB0YXZlc19jdHJ5LCBjb2xvciA9IHRhdmVzX2N0cnkpKSArCiAgZmFjZXRfZ3JpZCh+IHRhdmVzX2N0cnksIHNjYWxlcyA9ICJmcmVlIikgKwogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC41LCBsdHkgPSAyKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImlkZW50aXR5Iiwgc2l6ZSA9IDEsIGFscGhhID0gMC41KSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIsIGd1aWRlID0gIm5vbmUiKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiLCBndWlkZSA9ICJub25lIikgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDEpLCBicmVha3MgPSBzZXEoMCwgMSwgMC41KSkgKwogIGxhYnModGl0bGUgPSAiQ2x1c3RlcjogMiIsCiAgICAgICB4ID0gIiIsIHkgPSAicHJvcG9ydGlvbiBzYXlpbmcgWUVTIikgKwogIHRoZW1lX2J3KCkgKwogIGNvb3JkX2ZsaXAoKQpgYGAKCkl0IGxvb2tzIGxpa2UgdGhlIHByZXZhbGVuY2UgcGF0dGVybiBoZXJlIGlzIGxvdyBpbiB0aGUgVVMgKDwxMCUpIGFuZCBtb2RlcmF0ZSBpbiBHaGFuYSAofjI1JSkuCgoKPFAgc3R5bGU9InBhZ2UtYnJlYWstYmVmb3JlOiBhbHdheXMiPgojIyBDbHVzdGVyIDMKCk5vdyBJJ2xsIHBsb3QgdGhlIHByZXZhbGVuY2Ugb2YgZW5kb3JzZW1lbnRzIGluIGVhY2ggc2l0ZSBmb3IgZWFjaCBvZiB0aGUgcXVlc3Rpb25zIGluIENsdXN0ZXIgMyAodGhlIGRhcmsgZ3JlZW4gY2x1c3RlciBpbiB0aGUgb3ZlcmFsbCBwbG90KS4KCkFnYWluLCBJJ2xsIHBsb3QgdGhlc2UgcXVlc3Rpb25zIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgdGhlaXIgcHJldmFsZW5jZSBpbiB0aGUgVVMgc2FtcGxlLCBqdXN0IGFzIGEgcG9pbnQgb2YgcmVmZXJlbmNlLgoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjd9CmhjbHVzdF9kZjIgJT4lCiAgZmlsdGVyKGNsdXN0ZXIgPT0gMykgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uX3RleHQgPSBnc3ViKCcoLnsxLDQwfSkoXFxzfCQpJywgJ1xcMVxuJywgcXVlc3Rpb25fdGV4dCkpICU+JQogIGdncGxvdChhZXMoeCA9IHJlb3JkZXIocXVlc3Rpb25fdGV4dCwgVVNfcHJldiksIHkgPSBwcmV2LAogICAgICAgICAgICAgZmlsbCA9IHRhdmVzX2N0cnksIGNvbG9yID0gdGF2ZXNfY3RyeSkpICsKICBmYWNldF9ncmlkKH4gdGF2ZXNfY3RyeSwgc2NhbGVzID0gImZyZWUiKSArCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjUsIGx0eSA9IDIpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiaWRlbnRpdHkiLCBzaXplID0gMSwgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIiwgZ3VpZGUgPSAibm9uZSIpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIsIGd1aWRlID0gIm5vbmUiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMSksIGJyZWFrcyA9IHNlcSgwLCAxLCAwLjUpKSArCiAgbGFicyh0aXRsZSA9ICJDbHVzdGVyOiAzIiwKICAgICAgIHggPSAiIiwgeSA9ICJwcm9wb3J0aW9uIHNheWluZyBZRVMiKSArCiAgdGhlbWVfYncoKSArCiAgY29vcmRfZmxpcCgpCmBgYAoKSXQgbG9va3MgbGlrZSB0aGUgcHJldmFsZW5jZSBwYXR0ZXJuIGhlcmUgaXMgcmVsYXRpdmVseSBoaWdoIGFjcm9zcyB0aGUgYm9hcmQgKD41MCUpLgoKCjxQIHN0eWxlPSJwYWdlLWJyZWFrLWJlZm9yZTogYWx3YXlzIj4KIyMgQ2x1c3RlciA0CgpOb3cgSSdsbCBwbG90IHRoZSBwcmV2YWxlbmNlIG9mIGVuZG9yc2VtZW50cyBpbiBlYWNoIHNpdGUgZm9yIGVhY2ggb2YgdGhlIHF1ZXN0aW9ucyBpbiBDbHVzdGVyIDQgKHRoZSBkYXJrIGJsdWUgY2x1c3RlciBpbiB0aGUgb3ZlcmFsbCBwbG90KS4KCkFnYWluLCBJJ2xsIHBsb3QgdGhlc2UgcXVlc3Rpb25zIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgdGhlaXIgcHJldmFsZW5jZSBpbiB0aGUgVVMgc2FtcGxlLCBqdXN0IGFzIGEgcG9pbnQgb2YgcmVmZXJlbmNlLgoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAxfQpoY2x1c3RfZGYyICU+JQogIGZpbHRlcihjbHVzdGVyID09IDQpICU+JQogIG11dGF0ZShxdWVzdGlvbl90ZXh0ID0gZ3N1YignKC57MSw0MH0pKFxcc3wkKScsICdcXDFcbicsIHF1ZXN0aW9uX3RleHQpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKHF1ZXN0aW9uX3RleHQsIFVTX3ByZXYpLCB5ID0gcHJldiwKICAgICAgICAgICAgIGZpbGwgPSB0YXZlc19jdHJ5LCBjb2xvciA9IHRhdmVzX2N0cnkpKSArCiAgZmFjZXRfZ3JpZCh+IHRhdmVzX2N0cnksIHNjYWxlcyA9ICJmcmVlIikgKwogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC41LCBsdHkgPSAyKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImlkZW50aXR5Iiwgc2l6ZSA9IDEsIGFscGhhID0gMC41KSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIsIGd1aWRlID0gIm5vbmUiKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiLCBndWlkZSA9ICJub25lIikgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDEpLCBicmVha3MgPSBzZXEoMCwgMSwgMC41KSkgKwogIGxhYnModGl0bGUgPSAiQ2x1c3RlcjogNCIsCiAgICAgICB4ID0gIiIsIHkgPSAicHJvcG9ydGlvbiBzYXlpbmcgWUVTIikgKwogIHRoZW1lX2J3KCkgKwogIGNvb3JkX2ZsaXAoKQpgYGAKCkl0IGxvb2tzIGxpa2UgdGhlIHByZXZhbGVuY2UgcGF0dGVybiBoZXJlIGlzIGdlbmVyYWxseSBtb2RlcmF0ZSBhY3Jvc3MgdGhlIHR3byBzaXRlcyAofjI1JSksIHNsaWdodGx5IGhpZ2hlciBpbiBHaGFuYSAofjQwJSkuCgoKPFAgc3R5bGU9InBhZ2UtYnJlYWstYmVmb3JlOiBhbHdheXMiPgojIyBDbHVzdGVyIDUKCk5vdyBJJ2xsIHBsb3QgdGhlIHByZXZhbGVuY2Ugb2YgZW5kb3JzZW1lbnRzIGluIGVhY2ggc2l0ZSBmb3IgZWFjaCBvZiB0aGUgcXVlc3Rpb25zIGluIENsdXN0ZXIgNSAodGhlIGRhcmsgcmVkIGNsdXN0ZXIgaW4gdGhlIG92ZXJhbGwgcGxvdCkuCgpBZ2FpbiwgSSdsbCBwbG90IHRoZXNlIHF1ZXN0aW9ucyBpbiBkZXNjZW5kaW5nIG9yZGVyIG9mIHRoZWlyIHByZXZhbGVuY2UgaW4gdGhlIFVTIHNhbXBsZSwganVzdCBhcyBhIHBvaW50IG9mIHJlZmVyZW5jZS4KCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC42fQpoY2x1c3RfZGYyICU+JQogIGZpbHRlcihjbHVzdGVyID09IDUpICU+JQogIG11dGF0ZShxdWVzdGlvbl90ZXh0ID0gZ3N1YignKC57MSw0MH0pKFxcc3wkKScsICdcXDFcbicsIHF1ZXN0aW9uX3RleHQpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKHF1ZXN0aW9uX3RleHQsIFVTX3ByZXYpLCB5ID0gcHJldiwKICAgICAgICAgICAgIGZpbGwgPSB0YXZlc19jdHJ5LCBjb2xvciA9IHRhdmVzX2N0cnkpKSArCiAgZmFjZXRfZ3JpZCh+IHRhdmVzX2N0cnksIHNjYWxlcyA9ICJmcmVlIikgKwogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC41LCBsdHkgPSAyKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImlkZW50aXR5Iiwgc2l6ZSA9IDEsIGFscGhhID0gMC41KSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIsIGd1aWRlID0gIm5vbmUiKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiLCBndWlkZSA9ICJub25lIikgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDEpLCBicmVha3MgPSBzZXEoMCwgMSwgMC41KSkgKwogIGxhYnModGl0bGUgPSAiQ2x1c3RlcjogNSIsCiAgICAgICB4ID0gIiIsIHkgPSAicHJvcG9ydGlvbiBzYXlpbmcgWUVTIikgKwogIHRoZW1lX2J3KCkgKwogIGNvb3JkX2ZsaXAoKQpgYGAKCkl0IGxvb2tzIGxpa2UgdGhlIHByZXZhbGVuY2UgcGF0dGVybiBoZXJlIGlzIGdlbmVyYWxseSBjb21wYXJhYmxlIGFuZCBtb2RlcmF0ZSAoY2xvc2UgdG8gNTAlKSBhY3Jvc3MgdGhlIGJvYXJkIC0gaWYgYW55dGhpbmcsIHBlcmhhcHMgYSBsaXR0bGUgaGlnaGVyIGluIHRoZSBVUyBvbiBhIGNvdXBsZSBvZiBpdGVtcy4KCgo8UCBzdHlsZT0icGFnZS1icmVhay1iZWZvcmU6IGFsd2F5cyI+CiMjIENsdXN0ZXIgNgoKTm93IEknbGwgcGxvdCB0aGUgcHJldmFsZW5jZSBvZiBlbmRvcnNlbWVudHMgaW4gZWFjaCBzaXRlIGZvciBlYWNoIG9mIHRoZSBxdWVzdGlvbnMgaW4gQ2x1c3RlciA2ICh0aGUgbGlnaHQgYmx1ZSBjbHVzdGVyIGluIHRoZSBvdmVyYWxsIHBsb3QpLgoKQWdhaW4sIEknbGwgcGxvdCB0aGVzZSBxdWVzdGlvbnMgaW4gZGVzY2VuZGluZyBvcmRlciBvZiB0aGVpciBwcmV2YWxlbmNlIGluIHRoZSBVUyBzYW1wbGUsIGp1c3QgYXMgYSBwb2ludCBvZiByZWZlcmVuY2UuCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDAuNH0KaGNsdXN0X2RmMiAlPiUKICBmaWx0ZXIoY2x1c3RlciA9PSA2KSAlPiUKICBtdXRhdGUocXVlc3Rpb25fdGV4dCA9IGdzdWIoJyguezEsNDB9KShcXHN8JCknLCAnXFwxXG4nLCBxdWVzdGlvbl90ZXh0KSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihxdWVzdGlvbl90ZXh0LCBVU19wcmV2KSwgeSA9IHByZXYsCiAgICAgICAgICAgICBmaWxsID0gdGF2ZXNfY3RyeSwgY29sb3IgPSB0YXZlc19jdHJ5KSkgKwogIGZhY2V0X2dyaWQofiB0YXZlc19jdHJ5LCBzY2FsZXMgPSAiZnJlZSIpICsKICAjIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAuNSwgbHR5ID0gMikgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJpZGVudGl0eSIsIHNpemUgPSAxLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiLCBndWlkZSA9ICJub25lIikgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIiwgZ3VpZGUgPSAibm9uZSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAxKSwgYnJlYWtzID0gc2VxKDAsIDEsIDAuNSkpICsKICBsYWJzKHRpdGxlID0gIkNsdXN0ZXI6IDYiLAogICAgICAgeCA9ICIiLCB5ID0gInByb3BvcnRpb24gc2F5aW5nIFlFUyIpICsKICB0aGVtZV9idygpICsKICBjb29yZF9mbGlwKCkKYGBgCgpJdCBsb29rcyBsaWtlIHRoZSBwcmV2YWxlbmNlIHBhdHRlcm4gaGVyZSBpcyB2ZXJ5IGxvdyBpbiB0aGUgVVMgKDwxMCUpIGFuZCBzbGlnaHRseSBoaWdoZXIgaW4gR2hhbmEgKH4yMCUpLgoKPFAgc3R5bGU9InBhZ2UtYnJlYWstYmVmb3JlOiBhbHdheXMiPgojIyBDbHVzdGVyIDcKCk5vdyBJJ2xsIHBsb3QgdGhlIHByZXZhbGVuY2Ugb2YgZW5kb3JzZW1lbnRzIGluIGVhY2ggc2l0ZSBmb3IgZWFjaCBvZiB0aGUgcXVlc3Rpb25zIGluIENsdXN0ZXIgNyAodGhlIGRhcmsgb3JhbmdlIGNsdXN0ZXIgaW4gdGhlIG92ZXJhbGwgcGxvdCkuCgpBZ2FpbiwgSSdsbCBwbG90IHRoZXNlIHF1ZXN0aW9ucyBpbiBkZXNjZW5kaW5nIG9yZGVyIG9mIHRoZWlyIHByZXZhbGVuY2UgaW4gdGhlIFVTIHNhbXBsZSwganVzdCBhcyBhIHBvaW50IG9mIHJlZmVyZW5jZS4KCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC40fQpoY2x1c3RfZGYyICU+JQogIGZpbHRlcihjbHVzdGVyID09IDcpICU+JQogIG11dGF0ZShxdWVzdGlvbl90ZXh0ID0gZ3N1YignKC57MSw0MH0pKFxcc3wkKScsICdcXDFcbicsIHF1ZXN0aW9uX3RleHQpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKHF1ZXN0aW9uX3RleHQsIFVTX3ByZXYpLCB5ID0gcHJldiwKICAgICAgICAgICAgIGZpbGwgPSB0YXZlc19jdHJ5LCBjb2xvciA9IHRhdmVzX2N0cnkpKSArCiAgZmFjZXRfZ3JpZCh+IHRhdmVzX2N0cnksIHNjYWxlcyA9ICJmcmVlIikgKwogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC41LCBsdHkgPSAyKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImlkZW50aXR5Iiwgc2l6ZSA9IDEsIGFscGhhID0gMC41KSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIsIGd1aWRlID0gIm5vbmUiKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiLCBndWlkZSA9ICJub25lIikgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDEpLCBicmVha3MgPSBzZXEoMCwgMSwgMC41KSkgKwogIGxhYnModGl0bGUgPSAiQ2x1c3RlcjogNyIsCiAgICAgICB4ID0gIiIsIHkgPSAicHJvcG9ydGlvbiBzYXlpbmcgWUVTIikgKwogIHRoZW1lX2J3KCkgKwogIGNvb3JkX2ZsaXAoKQpgYGAKCkl0IGxvb2tzIGxpa2UgdGhlIHByZXZhbGVuY2UgcGF0dGVybiBoZXJlIGlzIGZhaXJseSBsb3cgaW4gdGhlIFVTICg8MjUlKSBhbmQgaGlnaCBpbiBHaGFuYSAoPjUwJSkuCgoKPFAgc3R5bGU9InBhZ2UtYnJlYWstYmVmb3JlOiBhbHdheXMiPgojIyBDbHVzdGVyIDgKCk5vdyBJJ2xsIHBsb3QgdGhlIHByZXZhbGVuY2Ugb2YgZW5kb3JzZW1lbnRzIGluIGVhY2ggc2l0ZSBmb3IgZWFjaCBvZiB0aGUgcXVlc3Rpb25zIGluIENsdXN0ZXIgOCAodGhlIG90aGVyIGhhbGYgb2YgdGhlIGRhcmsgZ3JlZW4gY2x1c3RlciBpbiB0aGUgb3ZlcmFsbCBwbG90KS4KCkFnYWluLCBJJ2xsIHBsb3QgdGhlc2UgcXVlc3Rpb25zIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgdGhlaXIgcHJldmFsZW5jZSBpbiB0aGUgVVMgc2FtcGxlLCBqdXN0IGFzIGEgcG9pbnQgb2YgcmVmZXJlbmNlLgoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjJ9CmhjbHVzdF9kZjIgJT4lCiAgZmlsdGVyKGNsdXN0ZXIgPT0gOCkgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uX3RleHQgPSBnc3ViKCcoLnsxLDQwfSkoXFxzfCQpJywgJ1xcMVxuJywgcXVlc3Rpb25fdGV4dCkpICU+JQogIGdncGxvdChhZXMoeCA9IHJlb3JkZXIocXVlc3Rpb25fdGV4dCwgVVNfcHJldiksIHkgPSBwcmV2LAogICAgICAgICAgICAgZmlsbCA9IHRhdmVzX2N0cnksIGNvbG9yID0gdGF2ZXNfY3RyeSkpICsKICBmYWNldF9ncmlkKH4gdGF2ZXNfY3RyeSwgc2NhbGVzID0gImZyZWUiKSArCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjUsIGx0eSA9IDIpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiaWRlbnRpdHkiLCBzaXplID0gMSwgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIiwgZ3VpZGUgPSAibm9uZSIpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIsIGd1aWRlID0gIm5vbmUiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMSksIGJyZWFrcyA9IHNlcSgwLCAxLCAwLjUpKSArCiAgbGFicyh0aXRsZSA9ICJDbHVzdGVyOiA4IiwKICAgICAgIHggPSAiIiwgeSA9ICJwcm9wb3J0aW9uIHNheWluZyBZRVMiKSArCiAgdGhlbWVfYncoKSArCiAgY29vcmRfZmxpcCgpCmBgYAoKVGhpcyBpcyBvbmUgaXRlbSBhbmQgaXQgaGFwcGVucyB0byBiZSBtb2RlcmF0ZSBpbnRoZSBVUyBhbmQgaGlnaCBpbiBHaGFuYS4gSSB3b3VsZG4ndCBtYWtlIG11Y2ggb2YgdGhpcyBmYWN0b3IuCgo8UCBzdHlsZT0icGFnZS1icmVhay1iZWZvcmU6IGFsd2F5cyI+CgpgYGB7ciwgaW5jbHVkZSA9IEZ9CiMgQ29tcGFyaW5nIGNsdXN0ZXIgYW5hbHlzZXMKZnVsbF9qb2luKGhjbHVzdF9kZiAlPiUKICAgICAgICAgICAgZGlzdGluY3QoY2x1c3RlciwgcXVlc3Rpb24sIHF1ZXN0aW9uX3RleHQpICU+JQogICAgICAgICAgICByZW5hbWUoY2x1c3Rlcl81c2l0ZXMgPSBjbHVzdGVyKSwKICAgICAgICAgIGhjbHVzdF9kZjIgJT4lCiAgICAgICAgICAgIGRpc3RpbmN0KGNsdXN0ZXIsIHF1ZXN0aW9uKSAlPiUKICAgICAgICAgICAgcmVuYW1lKGNsdXN0ZXJfMnNpdGVzID0gY2x1c3RlcikpICU+JQogIHNlbGVjdChxdWVzdGlvbiwgcXVlc3Rpb25fdGV4dCwgY2x1c3Rlcl81c2l0ZXMsIGNsdXN0ZXJfMnNpdGVzKSAlPiUKICBjb3VudChjbHVzdGVyXzVzaXRlcywgY2x1c3Rlcl8yc2l0ZXMpICU+JQogIGdyb3VwX2J5KGNsdXN0ZXJfNXNpdGVzKSAlPiUKICBtdXRhdGUocHJvcCA9IG4vc3VtKG4pKSAlPiUKICB0b3BfbigxLCBwcm9wKSAlPiUgCiAgYXJyYW5nZShkZXNjKHByb3ApKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gRn0KaGNsdXN0X3ByZXYzIDwtIGRfcHJldl93aWRlICU+JSAKICByb3duYW1lc190b19jb2x1bW4oInRhdmVzX2N0cnkiKSAlPiUKICBmaWx0ZXIoIXRhdmVzX2N0cnkgJWluJSBjKCJVUyIsICJHaGFuYSIpKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXMoInRhdmVzX2N0cnkiKSAlPiUKICB0KCkgJT4lIAogIGRpc3QoKSAlPiUgCiAgaGNsdXN0KCkKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IEZ9CmhjbHVzdF9kZjMgPC0gZGF0YS5mcmFtZShjbHVzdGVyID0gY3V0cmVlKGhjbHVzdF9wcmV2MywgOCkpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigicXVlc3Rpb25fdGV4dCIpICU+JQogIGZ1bGxfam9pbihkX3ByZXYgJT4lIGZpbHRlcighdGF2ZXNfY3RyeSAlaW4lIGMoIlVTIiwgIkdoYW5hIikpKSAlPiUKICBsZWZ0X2pvaW4oZF9wcmV2ICU+JSAKICAgICAgICAgICAgICBmaWx0ZXIodGF2ZXNfY3RyeSA9PSAiVVMiKSAlPiUgCiAgICAgICAgICAgICAgZGlzdGluY3QocXVlc3Rpb24sIHByZXYpICU+JSAKICAgICAgICAgICAgICByZW5hbWUoIlVTX3ByZXYiID0gInByZXYiKSkgJT4lCiAgYXJyYW5nZShjbHVzdGVyLCBkZXNjKFVTX3ByZXYpLCB0YXZlc19jdHJ5KQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gRn0KZnVsbF9qb2luKGhjbHVzdF9kZjIgJT4lCiAgICAgICAgICAgIGRpc3RpbmN0KGNsdXN0ZXIsIHF1ZXN0aW9uLCBxdWVzdGlvbl90ZXh0KSAlPiUKICAgICAgICAgICAgcmVuYW1lKGNsdXN0ZXJfVVNHSCA9IGNsdXN0ZXIpLAogICAgICAgICAgaGNsdXN0X2RmMyAlPiUKICAgICAgICAgICAgZGlzdGluY3QoY2x1c3RlciwgcXVlc3Rpb24pICU+JQogICAgICAgICAgICByZW5hbWUoY2x1c3Rlcl9USENIVlQgPSBjbHVzdGVyKSkgJT4lCiAgc2VsZWN0KHF1ZXN0aW9uLCBxdWVzdGlvbl90ZXh0LCBjbHVzdGVyX1VTR0gsIGNsdXN0ZXJfVEhDSFZUKSAlPiUKICBjb3VudChjbHVzdGVyX1VTR0gsIGNsdXN0ZXJfVEhDSFZUKSAlPiUKICBncm91cF9ieShjbHVzdGVyX1VTR0gpICU+JQogIG11dGF0ZShwcm9wID0gbi9zdW0obikpICU+JQogIHRvcF9uKDEsIHByb3ApICU+JSAKICBhcnJhbmdlKGRlc2MocHJvcCkpCmBgYAoKCiMgVGVzdGluZyBwcmVkaWN0aW9ucwoKVGhlc2UgYXJlIHByZWRpY3Rpb25zIHdlIGFydGljdWxhdGVkIGFzIGEgZ3JvdXAgb24gMjAxOC0xMi0xMAoKYGBge3IsIGluY2x1ZGUgPSBGfQpoY2x1c3RfZGZfZ3JvdXBlZCA8LSBoY2x1c3RfZGYgJT4lCiAgbXV0YXRlKGxldmVsMSA9IGNhc2Vfd2hlbihjbHVzdGVyICVpbiUgYyg2LCA5LCA3LCA0KSB+ICI2Nzk0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXIgJWluJSBjKDgsIDUsIDEsIDMsIDIpIH4gIjg1MTMyIiksCiAgICAgICAgIGxldmVsMnVuY29tbW9uID0gY2FzZV93aGVuKGNsdXN0ZXIgJWluJSBjKDgsIDUsIDEpIH4gIjg1MSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXIgJWluJSBjKDMsIDIpIH4gIjMyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BX2NoYXJhY3Rlcl8pLAogICAgICAgICBsZXZlbDJjb21tb24gPSBjYXNlX3doZW4oY2x1c3RlciAlaW4lIGMoNiwgOSwgNykgfiAiNjc5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXIgJWluJSBjKDQpIH4gIjQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BX2NoYXJhY3Rlcl8pLAogICAgICAgICBsZXZlbDMgPSBjYXNlX3doZW4oY2x1c3RlciAlaW4lIGMoNiwgOSkgfiAiNjkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3RlciAlaW4lIGMoNykgfiAiNyIpKSAlPiUKICBtdXRhdGUobGV2ZWwxID0gZmFjdG9yKGxldmVsMSwgbGV2ZWxzID0gYygiODUxMzIiLCAiNjc5NCIpKSwKICAgICAgICAgbGV2ZWwydW5jb21tb24gPSBmYWN0b3IobGV2ZWwydW5jb21tb24sIGxldmVscyA9IGMoIjMyIiwgIjg1MSIpKSwKICAgICAgICAgbGV2ZWwyY29tbW9uID0gZmFjdG9yKGxldmVsMmNvbW1vbiwgbGV2ZWxzID0gYygiNjc5IiwgIjQiKSksCiAgICAgICAgIGxldmVsMyA9IGZhY3RvcihsZXZlbDMsIGxldmVscyA9IGMoIjciLCAiNjkiKSkpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBGfQpoY2x1c3RfZGZfZ3JvdXBlZCA8LSBoY2x1c3RfZGZfZ3JvdXBlZCAlPiUKICBmdWxsX2pvaW4oZF9iYXNlICU+JQogICAgICAgICAgICAgIHJvd25hbWVzX3RvX2NvbHVtbigidGF2ZXNfc3ViaiIpICU+JQogICAgICAgICAgICAgIGdhdGhlcihxdWVzdGlvbiwgcmVzcG9uc2UsIC10YXZlc19zdWJqKSAlPiUKICAgICAgICAgICAgICBmdWxsX2pvaW4oZDAgJT4lIGRpc3RpbmN0KHRhdmVzX2N0cnksIHRhdmVzX3N1YmopKSAlPiUKICAgICAgICAgICAgICBmaWx0ZXIoIWlzLm5hKHJlc3BvbnNlKSwgIWdyZXBsKCJudW0iLCBxdWVzdGlvbikpICU+JQogICAgICAgICAgICAgIGNvdW50KHRhdmVzX2N0cnksIHF1ZXN0aW9uKSkKYGBgCgoKIyMgQ2x1c3RlcnMgNjc5NCBhcmUgbW9yZSBjb21tb24gdGhhbiB0aGUgb3RoZXJzCgpgYGB7cn0KZ2xtZXIocHJldiB+IGxldmVsMSArICgxfHF1ZXN0aW9uKSArICgxfHRhdmVzX2N0cnkpLAogICAgICBoY2x1c3RfZGZfZ3JvdXBlZCwKICAgICAgZmFtaWx5ID0gImJpbm9taWFsIiwgd2VpZ2h0cyA9IG4pICU+JSAKICBzdW1tYXJ5KCkKYGBgCgpgYGB7cn0KaGNsdXN0X2RmX2dyb3VwZWQgJT4lCiAgZ3JvdXBfYnkobGV2ZWwxLCB0YXZlc19jdHJ5KSAlPiUKICBtdWx0aV9ib290X3N0YW5kYXJkKCJwcmV2IikgJT4lCiAgdW5ncm91cCgpICU+JQogIG11dGF0ZSh0YXZlc19jdHJ5ID0gZmFjdG9yKHRhdmVzX2N0cnksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIlVTIiwgIkdoYW5hIiwgIlRoYWlsYW5kIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hpbmEiLCAiVmFudWF0dSIpKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gbGV2ZWwxLCB5ID0gbWVhbiwgY29sb3IgPSB0YXZlc19jdHJ5KSkgKyAKICBnZW9tX3BvaW50cmFuZ2UoYWVzKHltaW4gPSBjaV9sb3dlciwgeW1heCA9IGNpX3VwcGVyKSwKICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSkpICsKICB5bGltKDAsIDEpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICB0aGVtZV9idygpICsKICBsYWJzKHRpdGxlID0gIlByZWRpY3Rpb246IENsdXN0ZXJzIDY3OTQgYXJlIG1vcmUgY29tbW9uIHRoYW4gdGhlIG90aGVycyIsCiAgICAgICB4ID0gIkNsdXN0ZXIgZ3JvdXAgKGxldmVsIDEgZGl2aWRlKSIsIHkgPSAiUHJldmFsZW5jZSAoMC0xKSIsCiAgICAgICBjb2xvciA9ICJTaXRlIikKYGBgCgpZZXMsIHRoaXMgcHJlZGljdGlvbiBpcyB1cGhlbGQgKGJvdGggaW4gdGhlIGFnZ3JlZ2F0ZSBhbmQgbG9va2luZyBhdCBlYWNoIHNpdGUgaW5kaXZpZHVhbGx5KS4KCgo8UCBzdHlsZT0icGFnZS1icmVhay1iZWZvcmU6IGFsd2F5cyI+CiMjIENsdXN0ZXJzIDY3OSBhcHByYWlzZWQgYXMgcmVsaWdpb3VzIG1vcmUgZnJlcXVlbnRseSB0aGFuIGNsdXN0ZXIgNAoKYGBge3J9CmRfYXBwcmFpc2FsX251bTIgPC0gZF9hcHByYWlzYWxfbnVtICU+JQogICAgICAgIHJvd25hbWVzX3RvX2NvbHVtbigidGF2ZXNfc3ViaiIpICU+JQogICAgICAgIGZ1bGxfam9pbihkMCAlPiUgZGlzdGluY3QodGF2ZXNfc3ViaiwgdGF2ZXNfY3RyeSkpICU+JQogICAgICAgIGdhdGhlcihxdWVzdGlvbiwgYXBwcmFpc2FsLCAtYyh0YXZlc19zdWJqLCB0YXZlc19jdHJ5KSkgJT4lCiAgICAgICAgbXV0YXRlKHF1ZXN0aW9uID0gZ3N1YigiYl9udW0iLCAiIiwgcXVlc3Rpb24pKSAlPiUKICAgICAgICBmdWxsX2pvaW4oaGNsdXN0X2RmX2dyb3VwZWQgJT4lIAogICAgICAgICAgICAgICAgICAgIHNlbGVjdChxdWVzdGlvbiwgY2x1c3Rlciwgc3RhcnRzX3dpdGgoImxldmVsIikpICU+JQogICAgICAgICAgICAgICAgICAgIGRpc3RpbmN0KCkpICU+JQogIGZpbHRlcighaXMubmEoYXBwcmFpc2FsKSkgJT4lCiAgZGlzdGluY3QoKQpgYGAKCmBgYHtyfQpsbWVyKGFwcHJhaXNhbCB+IGxldmVsMmNvbW1vbiArICgxfHF1ZXN0aW9uKSArICgxfHRhdmVzX2N0cnkvdGF2ZXNfc3ViaiksCiAgICAgZF9hcHByYWlzYWxfbnVtMiAlPiUgZmlsdGVyKCFpcy5uYShhcHByYWlzYWwpKSkgJT4lIAogIHN1bW1hcnkoKQpgYGAKCmBgYHtyfQpkX2FwcHJhaXNhbF9udW0yICU+JQogIGZpbHRlcighaXMubmEobGV2ZWwyY29tbW9uKSkgJT4lCiAgZ3JvdXBfYnkobGV2ZWwyY29tbW9uLCB0YXZlc19jdHJ5KSAlPiUKICBtdWx0aV9ib290X3N0YW5kYXJkKCJhcHByYWlzYWwiKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKHRhdmVzX2N0cnkgPSBmYWN0b3IodGF2ZXNfY3RyeSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiVVMiLCAiR2hhbmEiLCAiVGhhaWxhbmQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaGluYSIsICJWYW51YXR1IikpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBsZXZlbDJjb21tb24sIHkgPSBtZWFuLCBjb2xvciA9IHRhdmVzX2N0cnkpKSArCiAgZ2VvbV9wb2ludHJhbmdlKGFlcyh5bWluID0gY2lfbG93ZXIsIHltYXggPSBjaV91cHBlciksCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpKSArCiAgeWxpbSgtMSwgMSkgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIHRoZW1lX2J3KCkgKwogIGxhYnModGl0bGUgPSAiUHJlZGljdGlvbjogQ2x1c3RlcnMgNjc5IGFwcHJhaXNlZCBhcyByZWxpZ2lvdXMgbW9yZSBmcmVxdWVudGx5XG50aGFuIGNsdXN0ZXIgNCIsCiAgICAgICB4ID0gIkNsdXN0ZXIgZ3JvdXAgKGxldmVsIDIgZGl2aWRlLCBhbW9uZyAnY29tbW9uJyBjbHVzdGVycyBvbmx5KSIsIAogICAgICAgeSA9ICJBcHByYWlzYWwgKC0xIHRvICsxKSIsCiAgICAgICBjb2xvciA9ICJTaXRlIikKYGBgCgpgYGB7cn0KZF9hcHByYWlzYWxfbnVtMiAlPiUKICBmaWx0ZXIoIWlzLm5hKGxldmVsMmNvbW1vbikpICU+JQogIGdyb3VwX2J5KGxldmVsMmNvbW1vbiwgdGF2ZXNfY3RyeSkgJT4lCiAgbXVsdGlfYm9vdF9zdGFuZGFyZCgiYXBwcmFpc2FsIikgJT4lCiAgdW5ncm91cCgpICU+JQogIG11dGF0ZSh0YXZlc19jdHJ5ID0gZmFjdG9yKHRhdmVzX2N0cnksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIlVTIiwgIkdoYW5hIiwgIlRoYWlsYW5kIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hpbmEiLCAiVmFudWF0dSIpKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gbGV2ZWwyY29tbW9uLCAKICAgICAgICAgICAgIHkgPSBtZWFuLCBjb2xvciA9IHRhdmVzX2N0cnkpKSArIAogIGZhY2V0X2dyaWQofiB0YXZlc19jdHJ5KSArCiAgZ2VvbV9wb2ludHJhbmdlKGFlcyh5bWluID0gY2lfbG93ZXIsIHltYXggPSBjaV91cHBlciksCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpKSArCiAgeWxpbSgtMSwgMSkgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIHRoZW1lX2J3KCkgKwogIGxhYnModGl0bGUgPSAiUHJlZGljdGlvbjogQ2x1c3RlcnMgNjc5IGFwcHJhaXNlZCBhcyByZWxpZ2lvdXMgbW9yZSBmcmVxdWVudGx5XG50aGFuIGNsdXN0ZXIgNCIsCiAgICAgICB4ID0gIkNsdXN0ZXIgZ3JvdXAgKGxldmVsIDIgZGl2aWRlLCBhbW9uZyAnY29tbW9uJyBjbHVzdGVycyBvbmx5KSIsIAogICAgICAgeSA9ICJBcHByYWlzYWwgKC0xIHRvICsxKSIsCiAgICAgICBjb2xvciA9ICJTaXRlIikKYGBgCgpUaGUgcmVzdWx0cyBmb3IgdGhpcyBwcmVkaWN0aW9uIGFyZSBtaXhlZC4gSXQgaXMgKm5vdCogdXBoZWxkIGluIHRoZSBhZ2dyZWdhdGUsIGJ1dCBzZWVtcyB0byBiZSB0cnVlIGluIHRoZSBVUywgYW5kIHBvc3NpYmx5IGluIEdoYW5hIGFuZCBWYW51YXR1IChpLmUuLCBDaHJpc3RpYW4gY291bnRyaWVzPykuCgoKPFAgc3R5bGU9InBhZ2UtYnJlYWstYmVmb3JlOiBhbHdheXMiPgojIyBDbHVzdGVycyA2Nzkgd2lsbCBiZSBtYXJrZWQgYXMgcG9zaXRpdmUvbmVnYXRpdmUgcmF0aGVyIHRoYW4gY2x1c3RlciA0ICg/KQoKYGBge3J9CmRfdmFsZW5jZV9udW0yIDwtIGRfdmFsZW5jZV9udW0gJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJ0YXZlc19zdWJqIikgJT4lCiAgZnVsbF9qb2luKGQwICU+JSBkaXN0aW5jdCh0YXZlc19zdWJqLCB0YXZlc19jdHJ5KSkgJT4lCiAgZ2F0aGVyKHF1ZXN0aW9uLCB2YWxlbmNlLCAtYyh0YXZlc19zdWJqLCB0YXZlc19jdHJ5KSkgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uID0gZ3N1YigiZF9udW0iLCAiIiwgcXVlc3Rpb24pKSAlPiUKICBmdWxsX2pvaW4oaGNsdXN0X2RmX2dyb3VwZWQgJT4lCiAgICAgICAgICAgICAgc2VsZWN0KHF1ZXN0aW9uLCBjbHVzdGVyLCBzdGFydHNfd2l0aCgibGV2ZWwiKSkgJT4lCiAgICAgICAgICAgICAgZGlzdGluY3QoKSkgJT4lCiAgZmlsdGVyKCFpcy5uYSh2YWxlbmNlKSkgJT4lCiAgZGlzdGluY3QoKQpgYGAKCmBgYHtyfQpsbWVyKGFicyh2YWxlbmNlKSB+IGxldmVsMmNvbW1vbiArICgxfHF1ZXN0aW9uKSArICgxfHRhdmVzX2N0cnkvdGF2ZXNfc3ViaiksCiAgICAgZF92YWxlbmNlX251bTIgJT4lIGZpbHRlcighaXMubmEodmFsZW5jZSkpKSAlPiUgCiAgc3VtbWFyeSgpCmBgYAoKYGBge3J9CmRfdmFsZW5jZV9udW0yICU+JQogIGZpbHRlcighaXMubmEobGV2ZWwyY29tbW9uKSkgJT4lCiAgZ3JvdXBfYnkobGV2ZWwyY29tbW9uLCB0YXZlc19jdHJ5KSAlPiUKICBtdXRhdGUodmFsZW5jZSA9IGFicyh2YWxlbmNlKSkgJT4lCiAgbXVsdGlfYm9vdF9zdGFuZGFyZCgidmFsZW5jZSIpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGUodGF2ZXNfY3RyeSA9IGZhY3Rvcih0YXZlc19jdHJ5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJVUyIsICJHaGFuYSIsICJUaGFpbGFuZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoaW5hIiwgIlZhbnVhdHUiKSkpICU+JQogIGdncGxvdChhZXMoeCA9IGxldmVsMmNvbW1vbiwgeSA9IG1lYW4sIGNvbG9yID0gdGF2ZXNfY3RyeSkpICsKICBnZW9tX3BvaW50cmFuZ2UoYWVzKHltaW4gPSBjaV9sb3dlciwgeW1heCA9IGNpX3VwcGVyKSwKICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSkpICsKICB5bGltKDAsIDEpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICB0aGVtZV9idygpICsKICBsYWJzKHRpdGxlID0gIlByZWRpY3Rpb246IENsdXN0ZXJzIDY3OSB3aWxsIGJlIG1hcmtlZCBhc1xucG9zaXRpdmUvbmVnYXRpdmUgcmF0aGVyIHRoYW4gY2x1c3RlciA0IiwKICAgICAgIHggPSAiQ2x1c3RlciBncm91cCAobGV2ZWwgMiBkaXZpZGUsIGFtb25nICdjb21tb24nIGNsdXN0ZXJzIG9ubHkpIiwgCiAgICAgICB5ID0gIkFic29sdXRlIHZhbGVuY2UgKDAgdG8gMSkiLAogICAgICAgY29sb3IgPSAiU2l0ZSIpCmBgYAoKWWVzLCB0aGlzIHByZWRpY3Rpb24gaXMgdXBoZWxkIChib3RoIGluIHRoZSBhZ2dyZWdhdGUgYW5kIGxvb2tpbmcgYXQgZWFjaCBzaXRlIGluZGl2aWR1YWxseSwgd2l0aCB0aGUgcG9zc2libGUgZXhjZXB0aW9uIG9mIFZhbnVhdHUpLgoKCjxQIHN0eWxlPSJwYWdlLWJyZWFrLWJlZm9yZTogYWx3YXlzIj4KIyMgQ2x1c3RlciA2OSB3aWxsIGJlIG1vcmUgcG9zaXRpdmUgdGhhbiBjbHVzdGVyIDcKCmBgYHtyfQpsbWVyKHZhbGVuY2UgfiBsZXZlbDMgKyAoMXxxdWVzdGlvbikgKyAoMXx0YXZlc19jdHJ5L3RhdmVzX3N1YmopLAogICAgIGRfdmFsZW5jZV9udW0yICU+JSBmaWx0ZXIoIWlzLm5hKHZhbGVuY2UpKSkgJT4lIAogIHN1bW1hcnkoKQpgYGAKCmBgYHtyfQpkX3ZhbGVuY2VfbnVtMiAlPiUKICBmaWx0ZXIoIWlzLm5hKGxldmVsMykpICU+JQogIGdyb3VwX2J5KGxldmVsMywgdGF2ZXNfY3RyeSkgJT4lCiAgbXVsdGlfYm9vdF9zdGFuZGFyZCgidmFsZW5jZSIpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGUodGF2ZXNfY3RyeSA9IGZhY3Rvcih0YXZlc19jdHJ5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJVUyIsICJHaGFuYSIsICJUaGFpbGFuZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoaW5hIiwgIlZhbnVhdHUiKSkpICU+JQogIGdncGxvdChhZXMoeCA9IGxldmVsMywgeSA9IG1lYW4sIGNvbG9yID0gdGF2ZXNfY3RyeSkpICsKICBnZW9tX3BvaW50cmFuZ2UoYWVzKHltaW4gPSBjaV9sb3dlciwgeW1heCA9IGNpX3VwcGVyKSwKICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSkpICsKICB5bGltKC0xLCAxKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgdGhlbWVfYncoKSArCiAgbGFicyh0aXRsZSA9ICJQcmVkaWN0aW9uOiBDbHVzdGVycyA2OSBhcHByYWlzZWQgYXMgbW9yZVxucG9zaXRpdmUgdGhhbiA3IiwKICAgICAgIHggPSAiQ2x1c3RlciBncm91cCAobGV2ZWwgMyBkaXZpZGUsIC4uLikiLCAKICAgICAgIHkgPSAiVmFsZW5jZSAoLTEgdG8gMSkiLAogICAgICAgY29sb3IgPSAiU2l0ZSIpCmBgYAoKWWVzLCB0aGlzIHByZWRpY3Rpb24gaXMgY2xlYXJseSB1cGhlbGQgKGJvdGggaW4gdGhlIGFnZ3JlZ2F0ZSBhbmQgbG9va2luZyBhdCBlYWNoIHNpdGUgaW5kaXZpZHVhbGx5KS4KCgo8UCBzdHlsZT0icGFnZS1icmVhay1iZWZvcmU6IGFsd2F5cyI+CiMjIENsdXN0ZXJzIDY3OSBhcHByYWlzZWQgYXMgbW9yZSBzaWduaWZpY2FudCB0aGFuIDQKCmBgYHtyfQpkX3NpZ25pZmljYW5jZV9udW0yIDwtIGRfc2lnbmlmaWNhbmNlX251bSAlPiUKICAgICAgICByb3duYW1lc190b19jb2x1bW4oInRhdmVzX3N1YmoiKSAlPiUKICAgICAgICBmdWxsX2pvaW4oZDAgJT4lIGRpc3RpbmN0KHRhdmVzX3N1YmosIHRhdmVzX2N0cnkpKSAlPiUKICAgICAgICBnYXRoZXIocXVlc3Rpb24sIHNpZ25pZmljYW5jZSwgLWModGF2ZXNfc3ViaiwgdGF2ZXNfY3RyeSkpICU+JQogICAgICAgIG11dGF0ZShxdWVzdGlvbiA9IGdzdWIoImVfbnVtIiwgIiIsIHF1ZXN0aW9uKSkgJT4lCiAgICAgICAgZnVsbF9qb2luKGhjbHVzdF9kZl9ncm91cGVkICU+JSAKICAgICAgICAgICAgICAgICAgICBzZWxlY3QocXVlc3Rpb24sIGNsdXN0ZXIsIHN0YXJ0c193aXRoKCJsZXZlbCIpKSAlPiUKICAgICAgICAgICAgICAgICAgICBkaXN0aW5jdCgpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHNpZ25pZmljYW5jZSkpICU+JQogIGRpc3RpbmN0KCkKYGBgCgpgYGB7cn0KbG1lcihzaWduaWZpY2FuY2UgfiBsZXZlbDJjb21tb24gKyAoMXxxdWVzdGlvbikgKyAoMXx0YXZlc19jdHJ5L3RhdmVzX3N1YmopLAogICAgIGRfc2lnbmlmaWNhbmNlX251bTIgJT4lIGZpbHRlcighaXMubmEoc2lnbmlmaWNhbmNlKSkpICU+JSAKICBzdW1tYXJ5KCkKYGBgCgpgYGB7cn0KZF9zaWduaWZpY2FuY2VfbnVtMiAlPiUKICBmaWx0ZXIoIWlzLm5hKGxldmVsMmNvbW1vbikpICU+JQogIGdyb3VwX2J5KGxldmVsMmNvbW1vbiwgdGF2ZXNfY3RyeSkgJT4lCiAgbXVsdGlfYm9vdF9zdGFuZGFyZCgic2lnbmlmaWNhbmNlIikgJT4lCiAgdW5ncm91cCgpICU+JQogIG11dGF0ZSh0YXZlc19jdHJ5ID0gZmFjdG9yKHRhdmVzX2N0cnksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIlVTIiwgIkdoYW5hIiwgIlRoYWlsYW5kIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hpbmEiLCAiVmFudWF0dSIpKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gbGV2ZWwyY29tbW9uLCB5ID0gbWVhbiwgY29sb3IgPSB0YXZlc19jdHJ5KSkgKwogIGdlb21fcG9pbnRyYW5nZShhZXMoeW1pbiA9IGNpX2xvd2VyLCB5bWF4ID0gY2lfdXBwZXIpLAogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSkgKwogIHlsaW0oMCwgMSkgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIHRoZW1lX2J3KCkgKwogIGxhYnModGl0bGUgPSAiUHJlZGljdGlvbjogQ2x1c3RlcnMgNjc5IGFwcHJhaXNlZCBhcyBtb3JlXG5zaWduaWZpY2FudCB0aGFuIDQiLAogICAgICAgeCA9ICJDbHVzdGVyIGdyb3VwIChsZXZlbCAyIGRpdmlkZSwgYW1vbmcgJ2NvbW1vbicgY2x1c3RlcnMgb25seSkiLCAKICAgICAgIHkgPSAiU2lnbmlmaWNhbmNlICgwIHRvIDEpIiwKICAgICAgIGNvbG9yID0gIlNpdGUiKQpgYGAKClllcywgdGhpcyBwcmVkaWN0aW9uIGlzIHVwaGVsZCAoYm90aCBpbiB0aGUgYWdncmVnYXRlIGFuZCBsb29raW5nIGF0IGVhY2ggc2l0ZSBpbmRpdmlkdWFsbHkpLgoKCjxQIHN0eWxlPSJwYWdlLWJyZWFrLWJlZm9yZTogYWx3YXlzIj4KIyMgQ2x1c3RlcnMgODUxIG1vcmUgY29tbW9uIHRoYW4gY2x1c3RlcnMgMzIKCmBgYHtyfQpnbG1lcihwcmV2IH4gbGV2ZWwydW5jb21tb24gKyAoMXxxdWVzdGlvbikgKyAoMXx0YXZlc19jdHJ5KSwKICAgICAgaGNsdXN0X2RmX2dyb3VwZWQsCiAgICAgIGZhbWlseSA9ICJiaW5vbWlhbCIsIHdlaWdodHMgPSBuKSAlPiUgCiAgc3VtbWFyeSgpCmBgYAoKYGBge3J9CmhjbHVzdF9kZl9ncm91cGVkICU+JQogIGZpbHRlcighaXMubmEobGV2ZWwydW5jb21tb24pKSAlPiUKICBncm91cF9ieShsZXZlbDJ1bmNvbW1vbiwgdGF2ZXNfY3RyeSkgJT4lCiAgbXVsdGlfYm9vdF9zdGFuZGFyZCgicHJldiIpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGUodGF2ZXNfY3RyeSA9IGZhY3Rvcih0YXZlc19jdHJ5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJVUyIsICJHaGFuYSIsICJUaGFpbGFuZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoaW5hIiwgIlZhbnVhdHUiKSkpICU+JQogIGdncGxvdChhZXMoeCA9IGxldmVsMnVuY29tbW9uLCB5ID0gbWVhbiwgY29sb3IgPSB0YXZlc19jdHJ5KSkgKyAKICBnZW9tX3BvaW50cmFuZ2UoYWVzKHltaW4gPSBjaV9sb3dlciwgeW1heCA9IGNpX3VwcGVyKSwKICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSkpICsKICB5bGltKDAsIDEpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICB0aGVtZV9idygpICsKICBsYWJzKHRpdGxlID0gIlByZWRpY3Rpb246IENsdXN0ZXJzIDg1MSBtb3JlIGNvbW1vbiB0aGFuIGNsdXN0ZXJzIDMyIiwKICAgICAgIHggPSAiQ2x1c3RlciBncm91cCAobGV2ZWwgMiBkaXZpZGUsIGFtb25nICd1bmNvbW1vbicgY2x1c3RlcnMgb25seSkiLCAKICAgICAgIHkgPSAiUHJldmFsZW5jZSAoMC0xKSIsIGNvbG9yID0gIlNpdGUiKQpgYGAKClllcywgdGhpcyBwcmVkaWN0aW9uIGlzIHVwaGVsZCAoYm90aCBpbiB0aGUgYWdncmVnYXRlIGFuZCBsb29raW5nIGF0IGVhY2ggc2l0ZSBpbmRpdmlkdWFsbHksIHdpdGggdGhlIHByb2JhYmxlIGV4Y2VwdGlvbiBvZiBWYW51YXR1KS4KCgo8UCBzdHlsZT0icGFnZS1icmVhay1iZWZvcmU6IGFsd2F5cyI+CiMjIENsdXN0ZXJzIDggdG8gNSB0byAxOiBpbmNyZWFzZXMgaW4gZGl2ZXJnZW5jZSBiZXR3ZWVuIGNvdW50cmllcwoKYGBge3J9CmhjbHVzdF9kZl9ncm91cGVkICU+JQogIGZpbHRlcihjbHVzdGVyICVpbiUgYygiMSIsICI1IiwgIjgiKSkgJT4lIAogIGdyb3VwX2J5KGNsdXN0ZXIsIHRhdmVzX2N0cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX3ByZXYgPSBtZWFuKHByZXYsIG5hLnJtID0gVCkpICU+JQogIGdyb3VwX2J5KGNsdXN0ZXIpICU+JQogIHN1bW1hcmlzZShzZCA9IHNkKG1lYW5fcHJldikpCgpiYXJ0bGV0dC50ZXN0KG1lYW5fcHJldiB+IGNsdXN0ZXIsIAogICAgICAgICAgICAgIGhjbHVzdF9kZl9ncm91cGVkICU+JQogICAgICAgICAgICAgICAgZmlsdGVyKGNsdXN0ZXIgJWluJSBjKCIxIiwgIjUiLCAiOCIpKSAlPiUKICAgICAgICAgICAgICAgIGdyb3VwX2J5KGNsdXN0ZXIsIHRhdmVzX2N0cnkpICU+JQogICAgICAgICAgICAgICAgc3VtbWFyaXNlKG1lYW5fcHJldiA9IG1lYW4ocHJldiwgbmEucm0gPSBUKSkpCgpiYXJ0bGV0dC50ZXN0KG1lYW5fcHJldiB+IGNsdXN0ZXIsIAogICAgICAgICAgICAgIGhjbHVzdF9kZl9ncm91cGVkICU+JQogICAgICAgICAgICAgICAgZmlsdGVyKGNsdXN0ZXIgJWluJSBjKCIxIiwgIjUiKSkgJT4lCiAgICAgICAgICAgICAgICBncm91cF9ieShjbHVzdGVyLCB0YXZlc19jdHJ5KSAlPiUKICAgICAgICAgICAgICAgIHN1bW1hcmlzZShtZWFuX3ByZXYgPSBtZWFuKHByZXYsIG5hLnJtID0gVCkpKQoKYmFydGxldHQudGVzdChtZWFuX3ByZXYgfiBjbHVzdGVyLCAKICAgICAgICAgICAgICBoY2x1c3RfZGZfZ3JvdXBlZCAlPiUKICAgICAgICAgICAgICAgIGZpbHRlcihjbHVzdGVyICVpbiUgYygiNSIsICI4IikpICU+JQogICAgICAgICAgICAgICAgZ3JvdXBfYnkoY2x1c3RlciwgdGF2ZXNfY3RyeSkgJT4lCiAgICAgICAgICAgICAgICBzdW1tYXJpc2UobWVhbl9wcmV2ID0gbWVhbihwcmV2LCBuYS5ybSA9IFQpKSkKYGBgCgpgYGB7cn0KaGNsdXN0X2RmX2dyb3VwZWQgJT4lCiAgZmlsdGVyKGNsdXN0ZXIgJWluJSBjKCIxIiwgIjUiLCAiOCIpKSAlPiUKICBncm91cF9ieShjbHVzdGVyLCB0YXZlc19jdHJ5KSAlPiUKICBtdWx0aV9ib290X3N0YW5kYXJkKCJwcmV2IikgJT4lCiAgdW5ncm91cCgpICU+JQogIG11dGF0ZSh0YXZlc19jdHJ5ID0gZmFjdG9yKHRhdmVzX2N0cnksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIlVTIiwgIkdoYW5hIiwgIlRoYWlsYW5kIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hpbmEiLCAiVmFudWF0dSIpKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gZmFjdG9yKGNsdXN0ZXIsIGxldmVscyA9IGMoIjgiLCAiNSIsICIxIikpLCAKICAgICAgICAgICAgIHkgPSBtZWFuLCBjb2xvciA9IHRhdmVzX2N0cnkpKSArIAogIGdlb21fcG9pbnRyYW5nZShhZXMoeW1pbiA9IGNpX2xvd2VyLCB5bWF4ID0gY2lfdXBwZXIpLAogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSkgKwogIHlsaW0oMCwgMSkgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIHRoZW1lX2J3KCkgKwogIGxhYnModGl0bGUgPSAiUHJlZGljdGlvbjogQ2x1c3RlcnMgOCB0byA1IHRvIDE6IGluY3JlYXNlcyBpbiBkaXZlcmdlbmNlXG5iZXR3ZWVuIGNvdW50cmllcyIsCiAgICAgICB4ID0gIkNsdXN0ZXIgZ3JvdXAgKGxldmVsIDIgZGl2aWRlLCBhbW9uZyAndW5jb21tb24nIGNsdXN0ZXJzIG9ubHkpIiwgCiAgICAgICB5ID0gIlByZXZhbGVuY2UgKDAtMSkiLCBjb2xvciA9ICJTaXRlIikKYGBgCgpUaGlzIHByZWRpY3Rpb24gbG9va3MgbGlrZSBpdCdzIHVwaGVsZCBhY2NvcmRpbmcgdG8gdGhlIHBsb3QgKGRvdHMgZm9yIGVhY2ggc2l0ZSBhcmUgY2xvc2VzdCB0b2dldGhlciBmb3IgY2x1c3RlciA4IGFuZCBtb3N0IHNjYXR0ZXJlZCBmb3IgY2x1c3RlciAxKS4gSXQgZG9lc24ndCBjb21lIG91dCBhcyBzaWduaWZpY2FudCBpbiBhIGZvcm1hbCB0ZXN0IG9mIHRoZSB2YXJpYWJpbGl0eSBhY3Jvc3MgdGhlIGZpdmUgc2l0ZXMgZm9yIGVhY2ggY2x1c3RlciwgYnV0IEknbSBub3Qgc3VyZSB3aGV0aGVyIEknZCBleHBlY3QgdGhhdCB0byBjb21lIG91dCBvciBub3QsIGdpdmVuIHRoZSBzYW1wbGUgc2l6ZSAobiA9IDUgc2l0ZXMpLiAoR2VudWluZWx5IG5vdCBzdXJlISkKCgo8UCBzdHlsZT0icGFnZS1icmVhay1iZWZvcmU6IGFsd2F5cyI+CiMjIENsdXN0ZXJzIDggdG8gNSB0byAxOiBkZWNyZWFzZXMgaW4gZnJlcXVlbmN5CgpgYGB7cn0KZ2xtZXIocHJldiB+IGNsdXN0ZXIgKyAoMXxxdWVzdGlvbikgKyAoMXx0YXZlc19jdHJ5KSwKICAgICAgaGNsdXN0X2RmX2dyb3VwZWQgJT4lCiAgICAgICAgZmlsdGVyKGNsdXN0ZXIgJWluJSBjKCIxIiwgIjUiLCAiOCIpKSAlPiUKICAgICAgICBtdXRhdGUoY2x1c3RlciA9IGZhY3RvcihjbHVzdGVyLCBsZXZlbHMgPSBjKCI4IiwgIjUiLCAiMSIpKSksCiAgICAgIGNvbnRyYXN0cyA9IGxpc3QoY2x1c3RlciA9IGNvbnRyLnBvbHkoMykpLAogICAgICBmYW1pbHkgPSAiYmlub21pYWwiLCB3ZWlnaHRzID0gbikgJT4lIAogIHN1bW1hcnkoKQpgYGAKCmBgYHtyfQpoY2x1c3RfZGZfZ3JvdXBlZCAlPiUKICBmaWx0ZXIoY2x1c3RlciAlaW4lIGMoIjEiLCAiNSIsICI4IikpICU+JQogIGdyb3VwX2J5KGNsdXN0ZXIsIHRhdmVzX2N0cnkpICU+JQogIG11bHRpX2Jvb3Rfc3RhbmRhcmQoInByZXYiKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKHRhdmVzX2N0cnkgPSBmYWN0b3IodGF2ZXNfY3RyeSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiVVMiLCAiR2hhbmEiLCAiVGhhaWxhbmQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaGluYSIsICJWYW51YXR1IikpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBmYWN0b3IoY2x1c3RlciwgbGV2ZWxzID0gYygiOCIsICI1IiwgIjEiKSksIAogICAgICAgICAgICAgeSA9IG1lYW4sIGNvbG9yID0gdGF2ZXNfY3RyeSkpICsgCiAgZ2VvbV9wb2ludHJhbmdlKGFlcyh5bWluID0gY2lfbG93ZXIsIHltYXggPSBjaV91cHBlciksCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpKSArCiAgeWxpbSgwLCAxKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgdGhlbWVfYncoKSArCiAgbGFicyh0aXRsZSA9ICJQcmVkaWN0aW9uOiBDbHVzdGVycyA4IHRvIDUgdG8gMTogZGVjcmVhc2VzIGluIGZyZXF1ZW5jeSIsCiAgICAgICB4ID0gIkNsdXN0ZXIgZ3JvdXAgKGxldmVsIDIgZGl2aWRlLCBhbW9uZyAndW5jb21tb24nIGNsdXN0ZXJzIG9ubHkpIiwgCiAgICAgICB5ID0gIlByZXZhbGVuY2UgKDAtMSkiLCBjb2xvciA9ICJTaXRlIikKYGBgCgpObywgdGhpcyBwcmVkaWN0aW9uIGlzICpub3QqIHVwaGVsZCAoZWl0aGVyIGluIHRoZSBhZ2dyZWdhdGUgb3IgbG9va2luZyBhdCBlYWNoIHNpdGUgaW5kaXZpZHVhbGx5LCB3aXRoIHRoZSBwb3NzaWJsZSBleGNlcHRpb24gb2YgVGhhaWxhbmQpLiBJZiBhbnl0aGluZywgY2x1c3RlciAxIGdlbmVyYWxseSBzZWVtcyB0byBiZSB0aGUgbW9zdCBjb21tb24gb2YgdGhlc2UgdGhyZWUgY2x1c3RlcnMuCgoKPFAgc3R5bGU9InBhZ2UtYnJlYWstYmVmb3JlOiBhbHdheXMiPgojIyBDbHVzdGVycyAzMjogR0ggYW5kIFZUIHN0YW5kIG91dCBmb3IgdGhlaXIgZW5kb3JzZW1lbnQKCmBgYHtyfQpnbG1lcihwcmV2IH4gbGV2ZWwydW5jb21tb24gKiB0YXZlc19jdHJ5ICsgKDF8cXVlc3Rpb24pLAogICAgICBoY2x1c3RfZGZfZ3JvdXBlZCAlPiUKICAgICAgICBmaWx0ZXIoIWlzLm5hKGxldmVsMnVuY29tbW9uKSkgJT4lCiAgICAgICAgbXV0YXRlKHRhdmVzX2N0cnkgPSBmYWN0b3IodGF2ZXNfY3RyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJVUyIsICJHaGFuYSIsICJUaGFpbGFuZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hpbmEiLCAiVmFudWF0dSIpKSksCiAgICAgIGNvbnRyYXN0cyA9IGxpc3QodGF2ZXNfY3RyeSA9IGNiaW5kKCJVU19vdGhlciIgPSBjKDQsIC0xLCAtMSwgLTEsIC0xKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdIVlRfVEhDSCIgPSBjKDAsIDEsIC0xLCAtMSwgMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHSF9WVCIgPSBjKDAsIDEsIDAsIDAsIC0xKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRIX0NIIiA9IGMoMCwgMCwgLTEsIDEsIDApKSksCiAgICAgIGZhbWlseSA9ICJiaW5vbWlhbCIsIHdlaWdodHMgPSBuKSAlPiUgCiAgc3VtbWFyeSgpCmBgYAoKYGBge3J9CmhjbHVzdF9kZl9ncm91cGVkICU+JQogIGZpbHRlcighaXMubmEobGV2ZWwydW5jb21tb24pKSAlPiUKICBncm91cF9ieShsZXZlbDJ1bmNvbW1vbiwgdGF2ZXNfY3RyeSkgJT4lCiAgbXVsdGlfYm9vdF9zdGFuZGFyZCgicHJldiIpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGUodGF2ZXNfY3RyeSA9IGZhY3Rvcih0YXZlc19jdHJ5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJVUyIsICJHaGFuYSIsICJUaGFpbGFuZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoaW5hIiwgIlZhbnVhdHUiKSksCiAgICAgICAgIEdIVlRfb3RoID0gY2FzZV93aGVuKHRhdmVzX2N0cnkgJWluJSBjKCJHaGFuYSIsICJWYW51YXR1IikgfiAiR0ggJiBWVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAib3RoZXIiKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gbGV2ZWwydW5jb21tb24sIHkgPSBtZWFuLCBjb2xvciA9IHRhdmVzX2N0cnksIHNoYXBlID0gR0hWVF9vdGgpKSArIAogIGdlb21fcG9pbnRyYW5nZShhZXMoeW1pbiA9IGNpX2xvd2VyLCB5bWF4ID0gY2lfdXBwZXIpLAogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSkgKwogIHlsaW0oMCwgMSkgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIHRoZW1lX2J3KCkgKwogIGxhYnModGl0bGUgPSAiUHJlZGljdGlvbjogQ2x1c3RlcnMgMzI6IEdIIGFuZCBWVCBzdGFuZCBvdXQgZm9yXG50aGVpciBlbmRvcnNlbWVudCIsCiAgICAgICB4ID0gIkNsdXN0ZXIgZ3JvdXAgKGxldmVsIDIgZGl2aWRlLCBhbW9uZyAndW5jb21tb24nIGNsdXN0ZXJzIG9ubHkpIiwgCiAgICAgICB5ID0gIlByZXZhbGVuY2UgKDAtMSkiLCBjb2xvciA9ICJTaXRlIiwgc2hhcGUgPSAiR2hhbmEvVmFudWF0dT8iKQpgYGAKClllcywgdGhpcyBwcmVkaWN0aW9uIGlzIHVwaGVsZCwgYnV0IHJhdGhlciB3ZWFrbHk6IEdoYW5hIGFuZCBWYW51YXR1IHN0YW5kIG91dCBpbiBib3RoIGNsdXN0ZXJzIDMyIGFuZCBjbHVzdGVycyA4NTEsIGJ1dCB0aGV5IHN0YW5kIG91dCBhIGxpdHRsZSBtb3JlIChnYXAgYmV0d2VlbiB0aGVtIGFuZCBvdGhlciBjb3VudHJpZXMgaXMgYSBsaXR0bGUgYmlnZ2VyKSBpbiBjbHVzdGVycyAzMi4KCgo8UCBzdHlsZT0icGFnZS1icmVhay1iZWZvcmU6IGFsd2F5cyI+CiMgT3ZlcmFsbCBzdW1tYXJpZXMgb2YgcHJldmFsZW5jZSwgYXBwcmFpc2FsLCB2YWxlbmNlLCAmIHNpZ25pZmljYW5jZQoKYGBge3IsIGluY2x1ZGUgPSBGfQpkZl9wcmV2YWxlbmNlIDwtIGRfYmFzZV9udW0gJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJ0YXZlc19zdWJqIikgJT4lCiAgZnVsbF9qb2luKGQwICU+JSBzZWxlY3QodGF2ZXNfc3ViaiwgdGF2ZXNfY3RyeSkpICU+JQogIGdhdGhlcihxdWVzdGlvbiwgZW5kb3JzZW1lbnQsIC1jKHRhdmVzX3N1YmosIHRhdmVzX2N0cnkpKSAlPiUKICBtdXRhdGUocXVlc3Rpb24gPSBnc3ViKCJfbnVtIiwgIiIsIHF1ZXN0aW9uKSkgJT4lCiAgZmlsdGVyKCFpcy5uYShlbmRvcnNlbWVudCkpICU+JQogIGdyb3VwX2J5KHRhdmVzX2N0cnksIHF1ZXN0aW9uKSAlPiUKICBtdXRhdGUocHJldl9uID0gbigpKSAlPiUKICBncm91cF9ieShwcmV2X24sIGFkZCA9IFQpICU+JQogIG11bHRpX2Jvb3Rfc3RhbmRhcmQoImVuZG9yc2VtZW50IikgJT4lCiAgdW5ncm91cCgpICU+JQogIHJlbmFtZShwcmV2X2NpX2xvd2VyID0gY2lfbG93ZXIsCiAgICAgICAgIHByZXZfY2lfdXBwZXIgPSBjaV91cHBlciwKICAgICAgICAgcHJldl9tZWFuID0gbWVhbikKCmRmX2FwcHJhaXNhbCA8LSBkX2FwcHJhaXNhbF9udW0yICU+JQogIG11dGF0ZShxdWVzdGlvbiA9IGdzdWIoIi5fbnVtIiwgIiIsIHF1ZXN0aW9uKSkgJT4lCiAgZmlsdGVyKCFpcy5uYShhcHByYWlzYWwpKSAlPiUKICBncm91cF9ieSh0YXZlc19jdHJ5LCBsZXZlbDEsIGxldmVsMnVuY29tbW9uLCBsZXZlbDJjb21tb24sIGxldmVsMywgCiAgICAgICAgICAgY2x1c3RlciwgcXVlc3Rpb24pICU+JQogIG11dGF0ZShhcHBfbiA9IG4oKSkgJT4lCiAgZ3JvdXBfYnkoYXBwX24sIGFkZCA9IFQpICU+JQogIG11bHRpX2Jvb3Rfc3RhbmRhcmQoImFwcHJhaXNhbCIpICU+JQogIHVuZ3JvdXAoKSAlPiUKICByZW5hbWUoYXBwX2NpX2xvd2VyID0gY2lfbG93ZXIsCiAgICAgICAgIGFwcF9jaV91cHBlciA9IGNpX3VwcGVyLAogICAgICAgICBhcHBfbWVhbiA9IG1lYW4pCgpkZl92YWxlbmNlIDwtIGRfdmFsZW5jZV9udW0yICU+JQogIG11dGF0ZShxdWVzdGlvbiA9IGdzdWIoIi5fbnVtIiwgIiIsIHF1ZXN0aW9uKSkgJT4lCiAgZmlsdGVyKCFpcy5uYSh2YWxlbmNlKSkgJT4lCiAgZ3JvdXBfYnkodGF2ZXNfY3RyeSwgbGV2ZWwxLCBsZXZlbDJ1bmNvbW1vbiwgbGV2ZWwyY29tbW9uLCBsZXZlbDMsIAogICAgICAgICAgIGNsdXN0ZXIsIHF1ZXN0aW9uKSAlPiUKICBtdXRhdGUodmFsX24gPSBuKCkpICU+JQogIGdyb3VwX2J5KHZhbF9uLCBhZGQgPSBUKSAlPiUKICBtdWx0aV9ib290X3N0YW5kYXJkKCJ2YWxlbmNlIikgJT4lCiAgdW5ncm91cCgpICU+JQogIHJlbmFtZSh2YWxfY2lfbG93ZXIgPSBjaV9sb3dlciwKICAgICAgICAgdmFsX2NpX3VwcGVyID0gY2lfdXBwZXIsCiAgICAgICAgIHZhbF9tZWFuID0gbWVhbikKCmRmX3NpZ25pZmljYW5jZSA8LSBkX3NpZ25pZmljYW5jZV9udW0yICU+JQogIG11dGF0ZShxdWVzdGlvbiA9IGdzdWIoIi5fbnVtIiwgIiIsIHF1ZXN0aW9uKSkgJT4lCiAgZmlsdGVyKCFpcy5uYShzaWduaWZpY2FuY2UpKSAlPiUKICBncm91cF9ieSh0YXZlc19jdHJ5LCBsZXZlbDEsIGxldmVsMnVuY29tbW9uLCBsZXZlbDJjb21tb24sIGxldmVsMywgCiAgICAgICAgICAgY2x1c3RlciwgcXVlc3Rpb24pICU+JQogIG11dGF0ZShzaWdfbiA9IG4oKSkgJT4lCiAgZ3JvdXBfYnkoc2lnX24sIGFkZCA9IFQpICU+JQogIG11bHRpX2Jvb3Rfc3RhbmRhcmQoInNpZ25pZmljYW5jZSIpICU+JQogIHVuZ3JvdXAoKSAlPiUKICByZW5hbWUoc2lnX2NpX2xvd2VyID0gY2lfbG93ZXIsCiAgICAgICAgIHNpZ19jaV91cHBlciA9IGNpX3VwcGVyLAogICAgICAgICBzaWdfbWVhbiA9IG1lYW4pCgpkZl9hbGxfcmVzcCA8LSBoY2x1c3RfZGZfZ3JvdXBlZCAlPiUgCiAgZGlzdGluY3QocXVlc3Rpb24sIHF1ZXN0aW9uX3RleHQsIFVTX3ByZXYsICAKICAgICAgICAgICBsZXZlbDEsIGxldmVsMnVuY29tbW9uLCBsZXZlbDJjb21tb24sIGxldmVsMywgY2x1c3RlcikgJT4lCiAgcmVuYW1lKHByZXZfVVMgPSBVU19wcmV2KSAlPiUKICBmdWxsX2pvaW4oZGZfcHJldmFsZW5jZSkgJT4lCiAgZnVsbF9qb2luKGRmX2FwcHJhaXNhbCkgJT4lCiAgZnVsbF9qb2luKGRmX3ZhbGVuY2UpICU+JQogIGZ1bGxfam9pbihkZl9zaWduaWZpY2FuY2UpICU+JQogIG11dGF0ZShsZXZlbDIgPSBpZmVsc2UoaXMubmEobGV2ZWwydW5jb21tb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmNoYXJhY3RlcihsZXZlbDJjb21tb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmNoYXJhY3RlcihsZXZlbDJ1bmNvbW1vbikpLAogICAgICAgICBjbHVzdGVyID0gZmFjdG9yKGNsdXN0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiOCIsICI1IiwgIjEiLCAiMyIsICIyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI2IiwgIjkiLCAiNyIsICI0IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiY2x1c3RlciA4IiwgImNsdXN0ZXIgNSIsICJjbHVzdGVyIDEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsdXN0ZXIgMyIsICJjbHVzdGVyIDIiLCAiY2x1c3RlciA2IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbHVzdGVyIDkiLCAiY2x1c3RlciA3ICIsICJjbHVzdGVyIDQiKSksCiAgICAgICAgIGxldmVsMSA9IGZhY3RvcihsZXZlbDEsCiAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCI4NTEzMiIsICI2Nzk0IiksCiAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJMMTogODUxMzIiLCAiTDE6IDY3OTQiKSksCiAgICAgICAgIGxldmVsMiA9IGZhY3RvcihsZXZlbDIsCiAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCI4NTEiLCAiMzIiLCAiNjc5IiwgIjQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkwyOiA4NTEiLCAiTDI6IDMyIiwgIkwyOiA2NzkiLCAiTDI6IDQiKSksCiAgICAgICAgIHRhdmVzX2N0cnkgPSBmYWN0b3IodGF2ZXNfY3RyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJVUyIsICJHaGFuYSIsICJUaGFpbGFuZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hpbmEiLCAiVmFudWF0dSIpKSkgJT4lCiAgc2VsZWN0KHRhdmVzX2N0cnksIGxldmVsMSwgbGV2ZWwyLCBsZXZlbDJ1bmNvbW1vbiwgbGV2ZWwyY29tbW9uLCBsZXZlbDMsIAogICAgICAgICBjbHVzdGVyLCBxdWVzdGlvbiwgcXVlc3Rpb25fdGV4dCwgcHJldl9VUywgCiAgICAgICAgIHN0YXJ0c193aXRoKCJwcmV2IiksIHN0YXJ0c193aXRoKCJhcHAiKSwgc3RhcnRzX3dpdGgoInNpZyIpLAogICAgICAgICBzdGFydHNfd2l0aCgidmFsIikpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDYsIGZpZy5hc3AgPSAwLjh9CmRmX2FsbF9yZXNwICU+JQogIGdncGxvdChhZXMoeCA9IHF1ZXN0aW9uLCB5ID0gcHJldl9tZWFuLCBjb2xvciA9IHRhdmVzX2N0cnksIGxhYmVsID0gcHJldl9uKSkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMobGV2ZWwxLCBsZXZlbDIsIGNsdXN0ZXIpLCAKICAgICAgICAgICAgIHJvd3MgPSB2YXJzKHRhdmVzX2N0cnkpLCAKICAgICAgICAgICAgIHNjYWxlcyA9ICJmcmVlX3giLCBzcGFjZSA9ICJmcmVlX3giKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC41LCBsdHkgPSAyKSArCiAgZ2VvbV9wb2ludHJhbmdlKGFlcyh5bWluID0gcHJldl9jaV9sb3dlciwgeW1heCA9IHByZXZfY2lfdXBwZXIpKSArCiAgZ2VvbV90ZXh0KHNpemUgPSAyLCB5ID0gMC4wNSwgY29sb3IgPSAiYmxhY2siKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiU2V0MiIpICsKICB5bGltKDAsIDEpICsKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgbGFicyh0aXRsZSA9ICJQUkVWQUxFTkNFOiBQcm9wb3J0aW9uIG9mIHBhcnRpY2lwYW50cyB3aG8gZW5kb3JzZWQgZXhwZXJpZW5jZSIsCiAgICAgICBzdWJ0aXRsZSA9ICJCeSBzaXRlIChyb3dzKSwgcXVlc3Rpb24gKHgtYXhpcyksIGFuZCBsZXZlbHMgMS0yIGdyb3VwaW5nIG9mIGNsdXN0ZXJzIChjb2x1bW5zKVxuTnVtYmVycyBmb3IgZWFjaCBxdWVzdGlvbiBpbmRpY2F0ZSB0aGUgdG90YWwgbnVtYmVyIG9mIHBhcnRpY2lwYW50cyBmcm9tIHRoYXQgc2l0ZSB3aG8gcmVzcG9uZGVkIHRvIHRoYXQgcXVlc3Rpb247IGVycm9yIGJhcnMgYXJlIDk1JSBib290c3RyYXBwZWQgQ0lzIiwKICAgICAgIHggPSAiUXVlc3Rpb24iLAogICAgICAgeSA9ICJQcmV2YWxlbmNlICgwLTEpIiwgY29sb3IgPSAiU2l0ZSIpCmBgYAoKPFAgc3R5bGU9InBhZ2UtYnJlYWstYmVmb3JlOiBhbHdheXMiPgpgYGB7ciwgZmlnLndpZHRoID0gNiwgZmlnLmFzcCA9IDAuOH0KZGZfYWxsX3Jlc3AgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcXVlc3Rpb24sIHkgPSBhcHBfbWVhbiwgY29sb3IgPSB0YXZlc19jdHJ5LCBsYWJlbCA9IGFwcF9uKSkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMobGV2ZWwxLCBsZXZlbDIsIGNsdXN0ZXIpLCAKICAgICAgICAgICAgIHJvd3MgPSB2YXJzKHRhdmVzX2N0cnkpLCAKICAgICAgICAgICAgIHNjYWxlcyA9ICJmcmVlX3giLCBzcGFjZSA9ICJmcmVlX3giKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbHR5ID0gMikgKwogIGdlb21fcG9pbnRyYW5nZShhZXMoeW1pbiA9IGFwcF9jaV9sb3dlciwgeW1heCA9IGFwcF9jaV91cHBlcikpICsKICBnZW9tX3RleHQoc2l6ZSA9IDIsIHkgPSAtMC45NSwgY29sb3IgPSAiYmxhY2siKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiU2V0MiIpICsKICB5bGltKC0xLCAxKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIGxhYnModGl0bGUgPSAiQVBQUkFJU0FMOiBNZWFuIHJlc3BvbnNlIHRvIHdoZXRoZXIgdGhlIHBhcnRpY2lwYW50IGFwcHJhaXNlZCBleHBlcmllbmNlIGFzIHJlbGlnaW91cy9zcGlyaXR1YWwiLAogICAgICAgc3VidGl0bGUgPSAiQnkgc2l0ZSAocm93cyksIHF1ZXN0aW9uICh4LWF4aXMpLCBhbmQgbGV2ZWxzIDEtMiBncm91cGluZyBvZiBjbHVzdGVycyAoY29sdW1ucylcbk51bWJlcnMgZm9yIGVhY2ggcXVlc3Rpb24gaW5kaWNhdGUgdGhlIHRvdGFsIG51bWJlciBvZiBwYXJ0aWNpcGFudHMgZnJvbSB0aGF0IHNpdGUgd2hvIHJlc3BvbmRlZCB0byB0aGF0IHF1ZXN0aW9uOyBlcnJvciBiYXJzIGFyZSA5NSUgYm9vdHN0cmFwcGVkIENJcyIsCiAgICAgICB4ID0gIlF1ZXN0aW9uIiwKICAgICAgIHkgPSAiQXBwcmFpc2FsICgtMTogbm8sIDA6IHVuc3VyZSwgKzE6IHllcykiLCBjb2xvciA9ICJTaXRlIikKYGBgCgo8UCBzdHlsZT0icGFnZS1icmVhay1iZWZvcmU6IGFsd2F5cyI+CmBgYHtyLCBmaWcud2lkdGggPSA2LCBmaWcuYXNwID0gMC44fQpkZl9hbGxfcmVzcCAlPiUKICBnZ3Bsb3QoYWVzKHggPSBxdWVzdGlvbiwgeSA9IHZhbF9tZWFuLCBjb2xvciA9IHRhdmVzX2N0cnksIGxhYmVsID0gdmFsX24pKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhsZXZlbDEsIGxldmVsMiwgY2x1c3RlciksIAogICAgICAgICAgICAgcm93cyA9IHZhcnModGF2ZXNfY3RyeSksIAogICAgICAgICAgICAgc2NhbGVzID0gImZyZWVfeCIsIHNwYWNlID0gImZyZWVfeCIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsdHkgPSAyKSArCiAgZ2VvbV9wb2ludHJhbmdlKGFlcyh5bWluID0gdmFsX2NpX2xvd2VyLCB5bWF4ID0gdmFsX2NpX3VwcGVyKSkgKwogIGdlb21fdGV4dChzaXplID0gMiwgeSA9IC0wLjk1LCBjb2xvciA9ICJibGFjayIpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJTZXQyIikgKwogIHlsaW0oLTEsIDEpICsKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgbGFicyh0aXRsZSA9ICJWQUxFTkNFOiBNZWFuIHJlc3BvbnNlIHRvIHdoZXRoZXIgZXhwZXJpZW5jZSB3YXMgY29uc2lkZXJlZCBwb3NpdGl2ZS9uZWdhdGl2ZSIsCiAgICAgICBzdWJ0aXRsZSA9ICJCeSBzaXRlIChyb3dzKSwgcXVlc3Rpb24gKHgtYXhpcyksIGFuZCBsZXZlbHMgMS0yIGdyb3VwaW5nIG9mIGNsdXN0ZXJzIChjb2x1bW5zKVxuTnVtYmVycyBmb3IgZWFjaCBxdWVzdGlvbiBpbmRpY2F0ZSB0aGUgdG90YWwgbnVtYmVyIG9mIHBhcnRpY2lwYW50cyBmcm9tIHRoYXQgc2l0ZSB3aG8gcmVzcG9uZGVkIHRvIHRoYXQgcXVlc3Rpb247IGVycm9yIGJhcnMgYXJlIDk1JSBib290c3RyYXBwZWQgQ0lzIiwKICAgICAgIHggPSAiUXVlc3Rpb24iLAogICAgICAgeSA9ICJWYWxlbmNlICgtMTogbmVnYXRpdmUsIDA6IG5ldXRyYWwsICsxOiBwb3NpdGl2ZSkiLCBjb2xvciA9ICJTaXRlIikKYGBgCgo8UCBzdHlsZT0icGFnZS1icmVhay1iZWZvcmU6IGFsd2F5cyI+CmBgYHtyLCBmaWcud2lkdGggPSA2LCBmaWcuYXNwID0gMC44fQpkZl9hbGxfcmVzcCAlPiUKICBnZ3Bsb3QoYWVzKHggPSBxdWVzdGlvbiwgeSA9IHNpZ19tZWFuLCBjb2xvciA9IHRhdmVzX2N0cnksIGxhYmVsID0gc2lnX24pKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhsZXZlbDEsIGxldmVsMiwgY2x1c3RlciksIAogICAgICAgICAgICAgcm93cyA9IHZhcnModGF2ZXNfY3RyeSksIAogICAgICAgICAgICAgc2NhbGVzID0gImZyZWVfeCIsIHNwYWNlID0gImZyZWVfeCIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjUsIGx0eSA9IDIpICsKICBnZW9tX3BvaW50cmFuZ2UoYWVzKHltaW4gPSBzaWdfY2lfbG93ZXIsIHltYXggPSBzaWdfY2lfdXBwZXIpKSArCiAgZ2VvbV90ZXh0KHNpemUgPSAyLCB5ID0gMC4wNSwgY29sb3IgPSAiYmxhY2siKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiU2V0MiIpICsKICB5bGltKDAsIDEpICsKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgbGFicyh0aXRsZSA9ICJTSUdOSUZJQ0FOQ0U6IE1lYW4gcmVzcG9uc2UgdG8gaG93IHNpZ25pZmljYW50IGV4cGVyaWVuY2Ugd2FzIGNvbnNpZGVyZWQiLAogICAgICAgc3VidGl0bGUgPSAiQnkgc2l0ZSAocm93cyksIHF1ZXN0aW9uICh4LWF4aXMpLCBhbmQgbGV2ZWxzIDEtMiBncm91cGluZyBvZiBjbHVzdGVycyAoY29sdW1ucylcbk51bWJlcnMgZm9yIGVhY2ggcXVlc3Rpb24gaW5kaWNhdGUgdGhlIHRvdGFsIG51bWJlciBvZiBwYXJ0aWNpcGFudHMgZnJvbSB0aGF0IHNpdGUgd2hvIHJlc3BvbmRlZCB0byB0aGF0IHF1ZXN0aW9uOyBlcnJvciBiYXJzIGFyZSA5NSUgYm9vdHN0cmFwcGVkIENJcyIsCiAgICAgICB4ID0gIlF1ZXN0aW9uIiwKICAgICAgIHkgPSAiU2lnbmlmaWNhbmNlICgwOiBub3QsIDAuNTogc29tZXdoYXQsIDE6IHZlcnkpIiwgY29sb3IgPSAiU2l0ZSIpCmBgYAoKCjxQIHN0eWxlPSJwYWdlLWJyZWFrLWJlZm9yZTogYWx3YXlzIj4KIyBEaXN0cmlidXRpb25zIChoaXN0b2dyYW1zKSBvZiBtZWFuIHJlc3BvbnNlcyBieSBxdWVzdGlvbgoKYGBge3J9Cmhpc3RvX2Z1biA8LSBmdW5jdGlvbihkZiwgY29sLCAKICAgICAgICAgICAgICAgICAgICAgIHNpdGVzID0gYygiVVMiLCAiR2hhbmEiLCAiVGhhaWxhbmQiLCAiQ2hpbmEiLCAiVmFudWF0dSIpKXsKICAKICBkZiA8LSBkZiAlPiUKICAgIG11dGF0ZSh0YXZlc19jdHJ5ID0gZmFjdG9yKHRhdmVzX2N0cnksIGxldmVscyA9IHNpdGVzKSkKCiAgeG1pbiA8LSBjYXNlX3doZW4oY29sICVpbiUgYygicHJldl9tZWFuIiwgInNpZ19tZWFuIikgfiAwLAogICAgICAgICAgICAgICAgICAgIGNvbCAlaW4lIGMoImFwcF9tZWFuIiwgInZhbF9tZWFuIikgfiAtMSkKICB4bWF4IDwtIDEKICBiaW53IDwtICh4bWF4IC0geG1pbikvMTAKICAKICBzdGF0cyA8LSBkZiAlPiUKICAgIGdyb3VwX2J5KHRhdmVzX2N0cnkpICU+JQogICAgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKCEhc3ltKGNvbCkpLAogICAgICAgICAgICAgIG1lZGlhbiA9IG1lZGlhbighIXN5bShjb2wpKSwKICAgICAgICAgICAgICB2YXIgPSB2YXIoISFzeW0oY29sKSkpICU+JQogICAgdW5ncm91cCgpCiAgCiAgcGxvdCA8LSBkZiAlPiUKICAgIGdncGxvdChhZXNfc3RyaW5nKHggPSBjb2wsIGZpbGwgPSAidGF2ZXNfY3RyeSIpKSArCiAgICBmYWNldF9ncmlkKH4gdGF2ZXNfY3RyeSkgKwogICAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSBiaW53LCBzaG93LmxlZ2VuZCA9IEYsIGNvbG9yID0gImJsYWNrIikgKwogICAgZ2VvbV90ZXh0KGRhdGEgPSBzdGF0cywKICAgICAgICAgICAgICBhZXMoeCA9IHhtYXggKyAyLjEgKiBiaW53LCB5ID0gMjUsCiAgICAgICAgICAgICAgICAgIGxhYmVsID0gcGFzdGUwKCJtZWFuOiAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0KHJvdW5kKG1lYW4sIDMpLCBuc21hbGwgPSAzKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbm1lZGlhbjogIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdChyb3VuZChtZWRpYW4sIDMpLCBuc21hbGwgPSAzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxudmFyaWFuY2U6ICIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQocm91bmQodmFyLCAzKSwgbnNtYWxsID0gMykpKSwKICAgICAgICAgICAgICB2anVzdCA9IDEsIGhqdXN0ID0gMSwgc2l6ZSA9IDMpICsKICAgIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYyh4bWluIC0gMi4xICogYmludywgeG1heCArIDIuMSAqIGJpbncpLAogICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNlcSh4bWluLCB4bWF4LCBiaW53ICogMikpICsKICAgIHRoZW1lX2J3KCkgKwogICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgICBsYWJzKHggPSAiTWVhbiByZXNwb25zZSBmb3IgYSBnaXZlbiBxdWVzdGlvbiAoYnkgc2l0ZSkiLAogICAgICAgICB5ID0gIk51bWJlciBvZiBxdWVzdGlvbnMiKQogIAogIHJldHVybihwbG90KQp9CmBgYAoKYGBge3J9CmRlbnNpdHlfZnVuIDwtIGZ1bmN0aW9uKGRmLCBjb2wsCiAgICAgICAgICAgICAgICAgICAgICAgIHNpdGVzID0gYygiVVMiLCAiR2hhbmEiLCAiVGhhaWxhbmQiLCAiQ2hpbmEiLCAiVmFudWF0dSIpKXsKICAKICBkZiA8LSBkZiAlPiUKICAgIG11dGF0ZSh0YXZlc19jdHJ5ID0gZmFjdG9yKHRhdmVzX2N0cnksIGxldmVscyA9IHNpdGVzKSkKCiAgeG1pbiA8LSBjYXNlX3doZW4oY29sICVpbiUgYygicHJldl9tZWFuIiwgInNpZ19tZWFuIikgfiAwLAogICAgICAgICAgICAgICAgICAgIGNvbCAlaW4lIGMoImFwcF9tZWFuIiwgInZhbF9tZWFuIikgfiAtMSkKICB4bWF4IDwtIDEKICBiaW53IDwtICh4bWF4IC0geG1pbikvMTAKICAKICBzdGF0cyA8LSBkZiAlPiUKICAgIGdyb3VwX2J5KHRhdmVzX2N0cnkpICU+JQogICAgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKCEhc3ltKGNvbCkpLAogICAgICAgICAgICAgIG1lZGlhbiA9IG1lZGlhbighIXN5bShjb2wpKSwKICAgICAgICAgICAgICB2YXIgPSB2YXIoISFzeW0oY29sKSkpICU+JQogICAgdW5ncm91cCgpCiAgCiAgcGxvdCA8LSBkZiAlPiUKICAgIGdncGxvdChhZXNfc3RyaW5nKHggPSBjb2wsIGZpbGwgPSAidGF2ZXNfY3RyeSIsIGNvbG9yID0gInRhdmVzX2N0cnkiKSkgKwogICAgZ2VvbV9kZW5zaXR5KGFscGhhID0gMC4xLCBzaXplID0gMSkgKwogICAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICAgIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogICAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoeG1pbiAtIDIuMSAqIGJpbncsIHhtYXggKyAyLjEgKiBiaW53KSwKICAgICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzZXEoeG1pbiwgeG1heCwgYmludyAqIDIpKSArCiAgICB0aGVtZV9idygpICsKICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkgKwogICAgbGFicyh4ID0gIk1lYW4gcmVzcG9uc2UgZm9yIGEgZ2l2ZW4gcXVlc3Rpb24gKGJ5IHNpdGUpIiwKICAgICAgICAgeSA9ICJEZW5zaXR5IChzY2FsZXMgd2l0aCAjIG9mIHF1ZXN0aW9ucykiLAogICAgICAgICBjb2xvciA9ICJTaXRlIiwgZmlsbCA9ICJTaXRlIikKICAKICByZXR1cm4ocGxvdCkKfQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC4zfQpoaXN0b19mdW4oZGZfcHJldmFsZW5jZSwgInByZXZfbWVhbiIpICsKICBsYWJzKHRpdGxlID0gIlBSRVZBTEVOQ0U6IERpc3RyaWJ1dGlvbnMgb2YgbWVhbiByZXNwb25zZXMiLAogICAgICAgeCA9ICJNZWFuIHByb3BvcnRpb24gb2YgJ3llcycgcmVzcG9uc2VzIChieSBzaXRlKSIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjN9CmRlbnNpdHlfZnVuKGRmX3ByZXZhbGVuY2UsICJwcmV2X21lYW4iKSArCiAgbGFicyh0aXRsZSA9ICJQUkVWQUxFTkNFOiBEaXN0cmlidXRpb25zIG9mIG1lYW4gcmVzcG9uc2VzIiwKICAgICAgIHggPSAiTWVhbiBwcm9wb3J0aW9uIG9mICd5ZXMnIHJlc3BvbnNlcyAoYnkgc2l0ZSkiKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC4zfQpoaXN0b19mdW4oZGZfYXBwcmFpc2FsLCAiYXBwX21lYW4iKSArCiAgbGFicyh0aXRsZSA9ICJBUFBSQUlTQUw6IERpc3RyaWJ1dGlvbnMgb2YgbWVhbiByZXNwb25zZXMiKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC4zfQpkZW5zaXR5X2Z1bihkZl9hcHByYWlzYWwsICJhcHBfbWVhbiIpICsKICBsYWJzKHRpdGxlID0gIkFQUFJBSVNBTDogRGlzdHJpYnV0aW9ucyBvZiBtZWFuIHJlc3BvbnNlcyIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjN9Cmhpc3RvX2Z1bihkZl92YWxlbmNlLCAidmFsX21lYW4iKSArCiAgbGFicyh0aXRsZSA9ICJWQUxFTkNFOiBEaXN0cmlidXRpb25zIG9mIG1lYW4gcmVzcG9uc2VzIikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDAuM30KZGVuc2l0eV9mdW4oZGZfdmFsZW5jZSwgInZhbF9tZWFuIikgKwogIGxhYnModGl0bGUgPSAiVkFMRU5DRTogRGlzdHJpYnV0aW9ucyBvZiBtZWFuIHJlc3BvbnNlcyIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjN9Cmhpc3RvX2Z1bihkZl9zaWduaWZpY2FuY2UsICJzaWdfbWVhbiIpICsKICBsYWJzKHRpdGxlID0gIlNJR05JRklDQU5DRTogRGlzdHJpYnV0aW9ucyBvZiBtZWFuIHJlc3BvbnNlcyIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjN9CmRlbnNpdHlfZnVuKGRmX3NpZ25pZmljYW5jZSwgInNpZ19tZWFuIikgKwogIGxhYnModGl0bGUgPSAiU0lHTklGSUNBTkNFOiBEaXN0cmlidXRpb25zIG9mIG1lYW4gcmVzcG9uc2VzIikKYGBgCgoKPFAgc3R5bGU9InBhZ2UtYnJlYWstYmVmb3JlOiBhbHdheXMiPgojIFJlbGlnaW9zaXR5IG9mIHBhcnRpY2lwYW50cwoKIyMjICJEbyB5b3UgY29uc2lkZXIgeW91cnNlbGYgYSByZWxpZ2lvdXMgb3Igc3Bpcml0dWFsIHBlcnNvbj8iCgpgYGB7ciwgcmVzdWx0cyA9ICJhc2lzIn0KZDAgJT4lIAogIG11dGF0ZV9hbGwoZnVucyh0b2xvd2VyKSkgJT4lCiAgbXV0YXRlKHRhdmVzX2RlbW9faG93cjEgPSBmYWN0b3IodGF2ZXNfZGVtb19ob3dyMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJub3QgYXQgYWxsIiwgInNsaWdodGx5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb21ld2hhdCIsICJ2ZXJ5IikpLAogICAgICAgICB0YXZlc19jdHJ5ID0gZmFjdG9yKHRhdmVzX2N0cnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygidXMiLCAiZ2hhbmEiLCAidGhhaWxhbmQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGluYSIsICJ2YW51YXR1IikpKSAlPiUKICBjb3VudCh0YXZlc19jdHJ5LCB0YXZlc19kZW1vX2hvd3IxKSAlPiUKICBncm91cF9ieSh0YXZlc19jdHJ5KSAlPiUKICBtdXRhdGUocHJvcCA9IG4vc3VtKG4pKSAlPiUKICBzZWxlY3QoLW4pICU+JQogIHNwcmVhZCh0YXZlc19kZW1vX2hvd3IxLCBwcm9wKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoLXRhdmVzX2N0cnkpLCBmdW5zKHJvdW5kKC4sIDIpKSkgJT4lCiAga25pdHI6OmthYmxlKCkgJT4lIAogIGthYmxlRXh0cmE6OmthYmxlX3N0eWxpbmcoKQpgYGAKClRoaXMgc2VlbXMgbGlrZSB0aGUgbW9zdCBiYXNpYyBxdWVzdGlvbiB3ZSBoYXZlIGFib3V0IHBhcnRpY2lwYW50IHJlbGlnaW9zaXR5LCBhbmQgb25lIHRoYXQgc3BsaXRzIHRoZSBVUyBzYW1wbGUgcm91Z2hseSBlcXVhbGx5IGludG8gYSBsZXNzIHJlbGlnaW91cyBncm91cCAoIm5vdCBhdCBhbGwiIG9yICJzbGlnaHRseSIpIHZzLiBhIG1vcmUgcmVsaWdpb3VzIGdyb3VwICgic29tZXdhaHQiIG9yICJ2ZXJ5IikuICoqSSB3aWxsIHVzZSB0aGlzIHF1ZXN0aW9uIHRvIHNwbGl0IHRoZSBVUyBzYW1wbGUsIGJlbG93LioqCgpgYGB7cn0KZGZfcmVsaWcgPC0gZDAgJT4lCiAgbXV0YXRlKHRhdmVzX2RlbW9faG93cjEgPSBmYWN0b3IodG9sb3dlcih0YXZlc19kZW1vX2hvd3IxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJub3QgYXQgYWxsIiwgInNsaWdodGx5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb21ld2hhdCIsICJ2ZXJ5IikpKSAlPiUKICBtdXRhdGUodGF2ZXNfY3RyeV9yZWxpZyA9IAogICAgICAgICAgIGNhc2Vfd2hlbih0YXZlc19jdHJ5ICE9ICJVUyIgfiB0YXZlc19jdHJ5LAogICAgICAgICAgICAgICAgICAgICB0YXZlc19jdHJ5ID09ICJVUyIgJiB0YXZlc19kZW1vX2hvd3IxICVpbiUKICAgICAgICAgICAgICAgICAgICAgICBjKCJub3QgYXQgYWxsIiwgInNsaWdodGx5IikgfiAiVVMsIGxlc3MgcmVsaWciLAogICAgICAgICAgICAgICAgICAgICB0YXZlc19jdHJ5ID09ICJVUyIgJiB0YXZlc19kZW1vX2hvd3IxICVpbiUKICAgICAgICAgICAgICAgICAgICAgICBjKCJzb21ld2hhdCIsICJ2ZXJ5IikgfiAiVVMsIG1vcmUgcmVsaWciKSkgJT4lCiAgZGlzdGluY3QodGF2ZXNfc3ViaiwgdGF2ZXNfY3RyeV9yZWxpZykKYGBgCgoKIyMjICJJIGNvbnNpZGVyIG15c2VsZiBhIHBlcnNvbiBvZiBmYWl0aCIKCmBgYHtyLCByZXN1bHRzID0gImFzaXMifQpkMCAlPiUgCiAgbXV0YXRlX2FsbChmdW5zKHRvbG93ZXIpKSAlPiUKICBtdXRhdGUodGF2ZXNfZmFpdCA9IGZhY3Rvcih0YXZlc19mYWl0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoInN0cm9uZ2x5IGRpc2FncmVlIiwgImRpc2FncmVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZWl0aGVyIGFncmVlIG5vciBkaXNhZ3JlZSIsICJhZ3JlZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3Ryb25nbHkgYWdyZWUiKSksCiAgICAgICAgIHRhdmVzX2N0cnkgPSBmYWN0b3IodGF2ZXNfY3RyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ1cyIsICJnaGFuYSIsICJ0aGFpbGFuZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoaW5hIiwgInZhbnVhdHUiKSkpICU+JQogIGNvdW50KHRhdmVzX2N0cnksIHRhdmVzX2ZhaXQpICU+JQogIGdyb3VwX2J5KHRhdmVzX2N0cnkpICU+JQogIG11dGF0ZShwcm9wID0gbi9zdW0obikpICU+JQogIHNlbGVjdCgtbikgJT4lCiAgc3ByZWFkKHRhdmVzX2ZhaXQsIHByb3ApICU+JQogIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGVfYXQodmFycygtdGF2ZXNfY3RyeSksIGZ1bnMocm91bmQoLiwgMikpKSAlPiUKICBrbml0cjo6a2FibGUoKSAlPiUgCiAga2FibGVFeHRyYTo6a2FibGVfc3R5bGluZygpCmBgYAoKSSBndWVzcyB3ZSBkaWRuJ3QgYXNrIHRoaXMgcXVlc3Rpb24gaW4gdGhlIFVTPwoKPFAgc3R5bGU9InBhZ2UtYnJlYWstYmVmb3JlOiBhbHdheXMiPgojIyMgIkRvIHlvdSBwYXJ0aWNpcGF0ZSBpbiBhIHJlbGlnaW91cyBvciBzcGlyaXR1YWwgZ3JvdXA/IgoKYGBge3IsIHJlc3VsdHMgPSAiYXNpcyJ9CmQwICU+JSAKICBtdXRhdGVfYWxsKGZ1bnModG9sb3dlcikpICU+JQogIG11dGF0ZSh0YXZlc19kZW1vX3JlZ3AgPSBmYWN0b3IodGF2ZXNfZGVtb19yZWdwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygibm8iLCAieWVzIikpLAogICAgICAgICB0YXZlc19jdHJ5ID0gZmFjdG9yKHRhdmVzX2N0cnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygidXMiLCAiZ2hhbmEiLCAidGhhaWxhbmQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGluYSIsICJ2YW51YXR1IikpKSAlPiUKICBjb3VudCh0YXZlc19jdHJ5LCB0YXZlc19kZW1vX3JlZ3ApICU+JQogIGdyb3VwX2J5KHRhdmVzX2N0cnkpICU+JQogIG11dGF0ZShwcm9wID0gbi9zdW0obikpICU+JQogIHNlbGVjdCgtbikgJT4lCiAgc3ByZWFkKHRhdmVzX2RlbW9fcmVncCwgcHJvcCkgJT4lCiAgdW5ncm91cCgpICU+JQogIG11dGF0ZV9hdCh2YXJzKC10YXZlc19jdHJ5KSwgZnVucyhyb3VuZCguLCAyKSkpICU+JQogIGtuaXRyOjprYWJsZSgpICU+JSAKICBrYWJsZUV4dHJhOjprYWJsZV9zdHlsaW5nKCkKYGBgCgo8UCBzdHlsZT0icGFnZS1icmVhay1iZWZvcmU6IGFsd2F5cyI+CiMjIE92ZXJhbGwgc3VtbWFyaWVzIG9mIHByZXZhbGVuY2UsIGFwcHJhaXNhbCwgdmFsZW5jZSwgYW5kIHNpZ25pZmlhbmNlLCBicmVha2luZyBkb3duIGJ5IHJlbGlnaW9zaXR5IGZvciBVUyBwYXJ0aWNpcGFudHMgb25seQoKYGBge3IsIGluY2x1ZGUgPSBGfQpkZl9wcmV2YWxlbmNlX3JlbGlnIDwtIGRfYmFzZV9udW0gJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJ0YXZlc19zdWJqIikgJT4lCiAgZnVsbF9qb2luKGRmX3JlbGlnKSAlPiUKICBnYXRoZXIocXVlc3Rpb24sIGVuZG9yc2VtZW50LCAtYyh0YXZlc19zdWJqLCB0YXZlc19jdHJ5X3JlbGlnKSkgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uID0gZ3N1YigiX251bSIsICIiLCBxdWVzdGlvbikpICU+JQogIGZpbHRlcighaXMubmEoZW5kb3JzZW1lbnQpKSAlPiUKICBncm91cF9ieSh0YXZlc19jdHJ5X3JlbGlnLCBxdWVzdGlvbikgJT4lCiAgbXV0YXRlKHByZXZfbiA9IG4oKSkgJT4lCiAgZ3JvdXBfYnkocHJldl9uLCBhZGQgPSBUKSAlPiUKICBtdWx0aV9ib290X3N0YW5kYXJkKCJlbmRvcnNlbWVudCIpICU+JQogIHVuZ3JvdXAoKSAlPiUKICByZW5hbWUocHJldl9jaV9sb3dlciA9IGNpX2xvd2VyLAogICAgICAgICBwcmV2X2NpX3VwcGVyID0gY2lfdXBwZXIsCiAgICAgICAgIHByZXZfbWVhbiA9IG1lYW4pCgpkZl9hcHByYWlzYWxfcmVsaWcgPC0gZF9hcHByYWlzYWxfbnVtMiAlPiUKICBmdWxsX2pvaW4oZGZfcmVsaWcpICU+JQogIG11dGF0ZShxdWVzdGlvbiA9IGdzdWIoIi5fbnVtIiwgIiIsIHF1ZXN0aW9uKSkgJT4lCiAgZmlsdGVyKCFpcy5uYShhcHByYWlzYWwpKSAlPiUKICBncm91cF9ieSh0YXZlc19jdHJ5X3JlbGlnLCBsZXZlbDEsIGxldmVsMnVuY29tbW9uLCBsZXZlbDJjb21tb24sIGxldmVsMywgCiAgICAgICAgICAgY2x1c3RlciwgcXVlc3Rpb24pICU+JQogIG11dGF0ZShhcHBfbiA9IG4oKSkgJT4lCiAgZ3JvdXBfYnkoYXBwX24sIGFkZCA9IFQpICU+JQogIG11bHRpX2Jvb3Rfc3RhbmRhcmQoImFwcHJhaXNhbCIpICU+JQogIHVuZ3JvdXAoKSAlPiUKICByZW5hbWUoYXBwX2NpX2xvd2VyID0gY2lfbG93ZXIsCiAgICAgICAgIGFwcF9jaV91cHBlciA9IGNpX3VwcGVyLAogICAgICAgICBhcHBfbWVhbiA9IG1lYW4pCgpkZl92YWxlbmNlX3JlbGlnIDwtIGRfdmFsZW5jZV9udW0yICU+JQogIGZ1bGxfam9pbihkZl9yZWxpZykgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uID0gZ3N1YigiLl9udW0iLCAiIiwgcXVlc3Rpb24pKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHZhbGVuY2UpKSAlPiUKICBncm91cF9ieSh0YXZlc19jdHJ5X3JlbGlnLCBsZXZlbDEsIGxldmVsMnVuY29tbW9uLCBsZXZlbDJjb21tb24sIGxldmVsMywgCiAgICAgICAgICAgY2x1c3RlciwgcXVlc3Rpb24pICU+JQogIG11dGF0ZSh2YWxfbiA9IG4oKSkgJT4lCiAgZ3JvdXBfYnkodmFsX24sIGFkZCA9IFQpICU+JQogIG11bHRpX2Jvb3Rfc3RhbmRhcmQoInZhbGVuY2UiKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgcmVuYW1lKHZhbF9jaV9sb3dlciA9IGNpX2xvd2VyLAogICAgICAgICB2YWxfY2lfdXBwZXIgPSBjaV91cHBlciwKICAgICAgICAgdmFsX21lYW4gPSBtZWFuKQoKZGZfc2lnbmlmaWNhbmNlX3JlbGlnIDwtIGRfc2lnbmlmaWNhbmNlX251bTIgJT4lCiAgZnVsbF9qb2luKGRmX3JlbGlnKSAlPiUKICBtdXRhdGUocXVlc3Rpb24gPSBnc3ViKCIuX251bSIsICIiLCBxdWVzdGlvbikpICU+JQogIGZpbHRlcighaXMubmEoc2lnbmlmaWNhbmNlKSkgJT4lCiAgZ3JvdXBfYnkodGF2ZXNfY3RyeV9yZWxpZywgbGV2ZWwxLCBsZXZlbDJ1bmNvbW1vbiwgbGV2ZWwyY29tbW9uLCBsZXZlbDMsIAogICAgICAgICAgIGNsdXN0ZXIsIHF1ZXN0aW9uKSAlPiUKICBtdXRhdGUoc2lnX24gPSBuKCkpICU+JQogIGdyb3VwX2J5KHNpZ19uLCBhZGQgPSBUKSAlPiUKICBtdWx0aV9ib290X3N0YW5kYXJkKCJzaWduaWZpY2FuY2UiKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgcmVuYW1lKHNpZ19jaV9sb3dlciA9IGNpX2xvd2VyLAogICAgICAgICBzaWdfY2lfdXBwZXIgPSBjaV91cHBlciwKICAgICAgICAgc2lnX21lYW4gPSBtZWFuKQoKZGZfYWxsX3Jlc3BfcmVsaWcgPC0gaGNsdXN0X2RmX2dyb3VwZWQgJT4lIAogIGRpc3RpbmN0KHF1ZXN0aW9uLCBxdWVzdGlvbl90ZXh0LCBVU19wcmV2LCAgCiAgICAgICAgICAgbGV2ZWwxLCBsZXZlbDJ1bmNvbW1vbiwgbGV2ZWwyY29tbW9uLCBsZXZlbDMsIGNsdXN0ZXIpICU+JQogIHJlbmFtZShwcmV2X1VTID0gVVNfcHJldikgJT4lCiAgZnVsbF9qb2luKGRmX3ByZXZhbGVuY2VfcmVsaWcpICU+JQogIGZ1bGxfam9pbihkZl9hcHByYWlzYWxfcmVsaWcpICU+JQogIGZ1bGxfam9pbihkZl92YWxlbmNlX3JlbGlnKSAlPiUKICBmdWxsX2pvaW4oZGZfc2lnbmlmaWNhbmNlX3JlbGlnKSAlPiUKICBtdXRhdGUobGV2ZWwyID0gaWZlbHNlKGlzLm5hKGxldmVsMnVuY29tbW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBhcy5jaGFyYWN0ZXIobGV2ZWwyY29tbW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBhcy5jaGFyYWN0ZXIobGV2ZWwydW5jb21tb24pKSwKICAgICAgICAgY2x1c3RlciA9IGZhY3RvcihjbHVzdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIjgiLCAiNSIsICIxIiwgIjMiLCAiMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNiIsICI5IiwgIjciLCAiNCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoImNsdXN0ZXIgOCIsICJjbHVzdGVyIDUiLCAiY2x1c3RlciAxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbHVzdGVyIDMiLCAiY2x1c3RlciAyIiwgImNsdXN0ZXIgNiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2x1c3RlciA5IiwgImNsdXN0ZXIgNyAiLCAiY2x1c3RlciA0IikpLAogICAgICAgICBsZXZlbDEgPSBmYWN0b3IobGV2ZWwxLAogICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiODUxMzIiLCAiNjc5NCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiTDE6IDg1MTMyIiwgIkwxOiA2Nzk0IikpLAogICAgICAgICBsZXZlbDIgPSBmYWN0b3IobGV2ZWwyLAogICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiODUxIiwgIjMyIiwgIjY3OSIsICI0IiksCiAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJMMjogODUxIiwgIkwyOiAzMiIsICJMMjogNjc5IiwgIkwyOiA0IikpLAogICAgICAgICB0YXZlc19jdHJ5X3JlbGlnID0gZmFjdG9yKHRhdmVzX2N0cnlfcmVsaWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiVVMsIGxlc3MgcmVsaWciLCAiVVMsIG1vcmUgcmVsaWciLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHaGFuYSIsICJUaGFpbGFuZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hpbmEiLCAiVmFudWF0dSIpKSkgJT4lCiAgc2VsZWN0KHRhdmVzX2N0cnlfcmVsaWcsIGxldmVsMSwgbGV2ZWwyLCBsZXZlbDJ1bmNvbW1vbiwgbGV2ZWwyY29tbW9uLCBsZXZlbDMsIAogICAgICAgICBjbHVzdGVyLCBxdWVzdGlvbiwgcXVlc3Rpb25fdGV4dCwgcHJldl9VUywgCiAgICAgICAgIHN0YXJ0c193aXRoKCJwcmV2IiksIHN0YXJ0c193aXRoKCJhcHAiKSwgc3RhcnRzX3dpdGgoInNpZyIpLAogICAgICAgICBzdGFydHNfd2l0aCgidmFsIikpCmBgYAoKCmBgYHtyLCBmaWcud2lkdGggPSA2LCBmaWcuYXNwID0gMC44fQpkZl9hbGxfcmVzcF9yZWxpZyAlPiUKICBnZ3Bsb3QoYWVzKHggPSBxdWVzdGlvbiwgeSA9IHByZXZfbWVhbiwgY29sb3IgPSB0YXZlc19jdHJ5X3JlbGlnLCBsYWJlbCA9IHByZXZfbikpICsKICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKGxldmVsMSwgbGV2ZWwyLCBjbHVzdGVyKSwgCiAgICAgICAgICAgICByb3dzID0gdmFycyh0YXZlc19jdHJ5X3JlbGlnKSwgCiAgICAgICAgICAgICBzY2FsZXMgPSAiZnJlZV94Iiwgc3BhY2UgPSAiZnJlZV94IikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAuNSwgbHR5ID0gMikgKwogIGdlb21fcG9pbnRyYW5nZShhZXMoeW1pbiA9IHByZXZfY2lfbG93ZXIsIHltYXggPSBwcmV2X2NpX3VwcGVyKSkgKwogIGdlb21fdGV4dChzaXplID0gMiwgeSA9IDAuMDUsIGNvbG9yID0gImJsYWNrIikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjNjZjMmE1IiwgIiM2NmMyYTUiLCAiI2ZjOGQ2MiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjOGRhMGNiIiwgIiNlNzhhYzMiLCAiI2E2ZDg1NCIpKSArCiAgeWxpbSgwLCAxKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIGxhYnModGl0bGUgPSAiUFJFVkFMRU5DRTogUHJvcG9ydGlvbiBvZiBwYXJ0aWNpcGFudHMgd2hvIGVuZG9yc2VkIGV4cGVyaWVuY2UiLAogICAgICAgc3VidGl0bGUgPSAiQnkgc2l0ZSAocm93cyksIHF1ZXN0aW9uICh4LWF4aXMpLCBhbmQgbGV2ZWxzIDEtMiBncm91cGluZyBvZiBjbHVzdGVycyAoY29sdW1ucylcbk51bWJlcnMgZm9yIGVhY2ggcXVlc3Rpb24gaW5kaWNhdGUgdGhlIHRvdGFsIG51bWJlciBvZiBwYXJ0aWNpcGFudHMgZnJvbSB0aGF0IHNpdGUgd2hvIHJlc3BvbmRlZCB0byB0aGF0IHF1ZXN0aW9uOyBlcnJvciBiYXJzIGFyZSA5NSUgYm9vdHN0cmFwcGVkIENJcyIsCiAgICAgICB4ID0gIlF1ZXN0aW9uIiwKICAgICAgIHkgPSAiUHJldmFsZW5jZSAoMC0xKSIsIGNvbG9yID0gIlNpdGUiKQpgYGAKCjxQIHN0eWxlPSJwYWdlLWJyZWFrLWJlZm9yZTogYWx3YXlzIj4KYGBge3IsIGZpZy53aWR0aCA9IDYsIGZpZy5hc3AgPSAwLjh9CmRmX2FsbF9yZXNwX3JlbGlnICU+JQogIGdncGxvdChhZXMoeCA9IHF1ZXN0aW9uLCB5ID0gYXBwX21lYW4sIGNvbG9yID0gdGF2ZXNfY3RyeV9yZWxpZywgbGFiZWwgPSBhcHBfbikpICsKICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKGxldmVsMSwgbGV2ZWwyLCBjbHVzdGVyKSwgCiAgICAgICAgICAgICByb3dzID0gdmFycyh0YXZlc19jdHJ5X3JlbGlnKSwgCiAgICAgICAgICAgICBzY2FsZXMgPSAiZnJlZV94Iiwgc3BhY2UgPSAiZnJlZV94IikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGx0eSA9IDIpICsKICBnZW9tX3BvaW50cmFuZ2UoYWVzKHltaW4gPSBhcHBfY2lfbG93ZXIsIHltYXggPSBhcHBfY2lfdXBwZXIpKSArCiAgZ2VvbV90ZXh0KHNpemUgPSAyLCB5ID0gLTAuOTUsIGNvbG9yID0gImJsYWNrIikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjNjZjMmE1IiwgIiM2NmMyYTUiLCAiI2ZjOGQ2MiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjOGRhMGNiIiwgIiNlNzhhYzMiLCAiI2E2ZDg1NCIpKSArCiAgeWxpbSgtMSwgMSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBsYWJzKHRpdGxlID0gIkFQUFJBSVNBTDogTWVhbiByZXNwb25zZSB0byB3aGV0aGVyIHRoZSBwYXJ0aWNpcGFudCBhcHByYWlzZWQgZXhwZXJpZW5jZSBhcyByZWxpZ2lvdXMvc3Bpcml0dWFsIiwKICAgICAgIHN1YnRpdGxlID0gIkJ5IHNpdGUgKHJvd3MpLCBxdWVzdGlvbiAoeC1heGlzKSwgYW5kIGxldmVscyAxLTIgZ3JvdXBpbmcgb2YgY2x1c3RlcnMgKGNvbHVtbnMpXG5OdW1iZXJzIGZvciBlYWNoIHF1ZXN0aW9uIGluZGljYXRlIHRoZSB0b3RhbCBudW1iZXIgb2YgcGFydGljaXBhbnRzIGZyb20gdGhhdCBzaXRlIHdobyByZXNwb25kZWQgdG8gdGhhdCBxdWVzdGlvbjsgZXJyb3IgYmFycyBhcmUgOTUlIGJvb3RzdHJhcHBlZCBDSXMiLAogICAgICAgeCA9ICJRdWVzdGlvbiIsCiAgICAgICB5ID0gIkFwcHJhaXNhbCAoLTE6IG5vLCAwOiB1bnN1cmUsICsxOiB5ZXMpIiwgY29sb3IgPSAiU2l0ZSIpCmBgYAoKPFAgc3R5bGU9InBhZ2UtYnJlYWstYmVmb3JlOiBhbHdheXMiPgpgYGB7ciwgZmlnLndpZHRoID0gNiwgZmlnLmFzcCA9IDAuOH0KZGZfYWxsX3Jlc3BfcmVsaWcgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcXVlc3Rpb24sIHkgPSB2YWxfbWVhbiwgY29sb3IgPSB0YXZlc19jdHJ5X3JlbGlnLCBsYWJlbCA9IHZhbF9uKSkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMobGV2ZWwxLCBsZXZlbDIsIGNsdXN0ZXIpLCAKICAgICAgICAgICAgIHJvd3MgPSB2YXJzKHRhdmVzX2N0cnlfcmVsaWcpLCAKICAgICAgICAgICAgIHNjYWxlcyA9ICJmcmVlX3giLCBzcGFjZSA9ICJmcmVlX3giKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbHR5ID0gMikgKwogIGdlb21fcG9pbnRyYW5nZShhZXMoeW1pbiA9IHZhbF9jaV9sb3dlciwgeW1heCA9IHZhbF9jaV91cHBlcikpICsKICBnZW9tX3RleHQoc2l6ZSA9IDIsIHkgPSAtMC45NSwgY29sb3IgPSAiYmxhY2siKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiM2NmMyYTUiLCAiIzY2YzJhNSIsICIjZmM4ZDYyIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiM4ZGEwY2IiLCAiI2U3OGFjMyIsICIjYTZkODU0IikpICsKICB5bGltKC0xLCAxKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIGxhYnModGl0bGUgPSAiVkFMRU5DRTogTWVhbiByZXNwb25zZSB0byB3aGV0aGVyIGV4cGVyaWVuY2Ugd2FzIGNvbnNpZGVyZWQgcG9zaXRpdmUvbmVnYXRpdmUiLAogICAgICAgc3VidGl0bGUgPSAiQnkgc2l0ZSAocm93cyksIHF1ZXN0aW9uICh4LWF4aXMpLCBhbmQgbGV2ZWxzIDEtMiBncm91cGluZyBvZiBjbHVzdGVycyAoY29sdW1ucylcbk51bWJlcnMgZm9yIGVhY2ggcXVlc3Rpb24gaW5kaWNhdGUgdGhlIHRvdGFsIG51bWJlciBvZiBwYXJ0aWNpcGFudHMgZnJvbSB0aGF0IHNpdGUgd2hvIHJlc3BvbmRlZCB0byB0aGF0IHF1ZXN0aW9uOyBlcnJvciBiYXJzIGFyZSA5NSUgYm9vdHN0cmFwcGVkIENJcyIsCiAgICAgICB4ID0gIlF1ZXN0aW9uIiwKICAgICAgIHkgPSAiVmFsZW5jZSAoLTE6IG5lZ2F0aXZlLCAwOiBuZXV0cmFsLCArMTogcG9zaXRpdmUpIiwgY29sb3IgPSAiU2l0ZSIpCmBgYAoKPFAgc3R5bGU9InBhZ2UtYnJlYWstYmVmb3JlOiBhbHdheXMiPgpgYGB7ciwgZmlnLndpZHRoID0gNiwgZmlnLmFzcCA9IDAuOH0KZGZfYWxsX3Jlc3BfcmVsaWcgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcXVlc3Rpb24sIHkgPSBzaWdfbWVhbiwgY29sb3IgPSB0YXZlc19jdHJ5X3JlbGlnLCBsYWJlbCA9IHNpZ19uKSkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMobGV2ZWwxLCBsZXZlbDIsIGNsdXN0ZXIpLCAKICAgICAgICAgICAgIHJvd3MgPSB2YXJzKHRhdmVzX2N0cnlfcmVsaWcpLCAKICAgICAgICAgICAgIHNjYWxlcyA9ICJmcmVlX3giLCBzcGFjZSA9ICJmcmVlX3giKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC41LCBsdHkgPSAyKSArCiAgZ2VvbV9wb2ludHJhbmdlKGFlcyh5bWluID0gc2lnX2NpX2xvd2VyLCB5bWF4ID0gc2lnX2NpX3VwcGVyKSkgKwogIGdlb21fdGV4dChzaXplID0gMiwgeSA9IDAuMDUsIGNvbG9yID0gImJsYWNrIikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjNjZjMmE1IiwgIiM2NmMyYTUiLCAiI2ZjOGQ2MiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjOGRhMGNiIiwgIiNlNzhhYzMiLCAiI2E2ZDg1NCIpKSArCiAgeWxpbSgwLCAxKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIGxhYnModGl0bGUgPSAiU0lHTklGSUNBTkNFOiBNZWFuIHJlc3BvbnNlIHRvIGhvdyBzaWduaWZpY2FudCBleHBlcmllbmNlIHdhcyBjb25zaWRlcmVkIiwKICAgICAgIHN1YnRpdGxlID0gIkJ5IHNpdGUgKHJvd3MpLCBxdWVzdGlvbiAoeC1heGlzKSwgYW5kIGxldmVscyAxLTIgZ3JvdXBpbmcgb2YgY2x1c3RlcnMgKGNvbHVtbnMpXG5OdW1iZXJzIGZvciBlYWNoIHF1ZXN0aW9uIGluZGljYXRlIHRoZSB0b3RhbCBudW1iZXIgb2YgcGFydGljaXBhbnRzIGZyb20gdGhhdCBzaXRlIHdobyByZXNwb25kZWQgdG8gdGhhdCBxdWVzdGlvbjsgZXJyb3IgYmFycyBhcmUgOTUlIGJvb3RzdHJhcHBlZCBDSXMiLAogICAgICAgeCA9ICJRdWVzdGlvbiIsCiAgICAgICB5ID0gIlNpZ25pZmljYW5jZSAoMDogbm90LCAwLjU6IHNvbWV3aGF0LCAxOiB2ZXJ5KSIsIGNvbG9yID0gIlNpdGUiKQpgYGAKCjxQIHN0eWxlPSJwYWdlLWJyZWFrLWJlZm9yZTogYWx3YXlzIj4KIyMgRGlzdHJpYnV0aW9ucyAoaGlzdG9ncmFtcykgb2YgbWVhbiByZXNwb25zZXMgYnkgcXVlc3Rpb24sIGJyZWFraW5nIGRvd24gYnkgcmVsaWdpb3NpdHkgZm9yIFVTIHBhcnRpY2lwYW50cyBvbmx5CgpgYGB7ciwgaW5jbHVkZSA9IEZ9CnBsb3RfcHJldl9yZWxpZyA8LSBoaXN0b19mdW4oZGZfcHJldmFsZW5jZV9yZWxpZyAlPiUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5hbWUodGF2ZXNfY3RyeSA9IHRhdmVzX2N0cnlfcmVsaWcpLCAKICAgICAgICAgICJwcmV2X21lYW4iLCAKICAgICAgICAgIHNpdGVzID0gYygiVVMsIGxlc3MgcmVsaWciLCAiVVMsIG1vcmUgcmVsaWciLCAKICAgICAgICAgICAgICAgICAgICAiR2hhbmEiLCAiVGhhaWxhbmQiLCAiQ2hpbmEiLCAiVmFudWF0dSIpKSArCiAgbGFicyh0aXRsZSA9ICJQUkVWQUxFTkNFOiBEaXN0cmlidXRpb25zIG9mIG1lYW4gcmVzcG9uc2VzIiwKICAgICAgIHggPSAiTWVhbiBwcm9wb3J0aW9uIG9mICd5ZXMnIHJlc3BvbnNlcyAoYnkgc2l0ZSkiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzFiOWU3NyIsICIjMWI5ZTc3IiwgIiNkOTVmMDIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiM3NTcwYjMiLCAiI2U3Mjk4YSIsICIjNjZhNjFlIikpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjN9CnBsb3RfcHJldl9yZWxpZwpgYGAKCmBgYHtyLCBpbmNsdWRlID0gRn0KcGxvdF9hcHBfcmVsaWcgPC0gaGlzdG9fZnVuKGRmX2FwcHJhaXNhbF9yZWxpZyAlPiUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZSh0YXZlc19jdHJ5ID0gdGF2ZXNfY3RyeV9yZWxpZyksIAogICAgICAgICAgImFwcF9tZWFuIiwgCiAgICAgICAgICBzaXRlcyA9IGMoIlVTLCBsZXNzIHJlbGlnIiwgIlVTLCBtb3JlIHJlbGlnIiwgCiAgICAgICAgICAgICAgICAgICAgIkdoYW5hIiwgIlRoYWlsYW5kIiwgIkNoaW5hIiwgIlZhbnVhdHUiKSkgKwogIGxhYnModGl0bGUgPSAiQVBQUkFJU0FMOiBEaXN0cmlidXRpb25zIG9mIG1lYW4gcmVzcG9uc2VzIiwKICAgICAgIHggPSAiTWVhbiBwcm9wb3J0aW9uIG9mICd5ZXMnIHJlc3BvbnNlcyAoYnkgc2l0ZSkiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzFiOWU3NyIsICIjMWI5ZTc3IiwgIiNkOTVmMDIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiM3NTcwYjMiLCAiI2U3Mjk4YSIsICIjNjZhNjFlIikpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjN9CnBsb3RfYXBwX3JlbGlnCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBGfQpwbG90X3ZhbF9yZWxpZyA8LSBoaXN0b19mdW4oZGZfdmFsZW5jZV9yZWxpZyAlPiUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZSh0YXZlc19jdHJ5ID0gdGF2ZXNfY3RyeV9yZWxpZyksIAogICAgICAgICAgInZhbF9tZWFuIiwgCiAgICAgICAgICBzaXRlcyA9IGMoIlVTLCBsZXNzIHJlbGlnIiwgIlVTLCBtb3JlIHJlbGlnIiwgCiAgICAgICAgICAgICAgICAgICAgIkdoYW5hIiwgIlRoYWlsYW5kIiwgIkNoaW5hIiwgIlZhbnVhdHUiKSkgKwogIGxhYnModGl0bGUgPSAiVkFMRU5DRTogRGlzdHJpYnV0aW9ucyBvZiBtZWFuIHJlc3BvbnNlcyIsCiAgICAgICB4ID0gIk1lYW4gcHJvcG9ydGlvbiBvZiAneWVzJyByZXNwb25zZXMgKGJ5IHNpdGUpIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiMxYjllNzciLCAiIzFiOWU3NyIsICIjZDk1ZjAyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjNzU3MGIzIiwgIiNlNzI5OGEiLCAiIzY2YTYxZSIpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC4zfQpwbG90X3ZhbF9yZWxpZwpgYGAKCmBgYHtyLCBpbmNsdWRlID0gRn0KcGxvdF9zaWdfcmVsaWcgPC0gaGlzdG9fZnVuKGRmX3NpZ25pZmljYW5jZV9yZWxpZyAlPiUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZSh0YXZlc19jdHJ5ID0gdGF2ZXNfY3RyeV9yZWxpZyksIAogICAgICAgICAgInNpZ19tZWFuIiwgCiAgICAgICAgICBzaXRlcyA9IGMoIlVTLCBsZXNzIHJlbGlnIiwgIlVTLCBtb3JlIHJlbGlnIiwgCiAgICAgICAgICAgICAgICAgICAgIkdoYW5hIiwgIlRoYWlsYW5kIiwgIkNoaW5hIiwgIlZhbnVhdHUiKSkgKwogIGxhYnModGl0bGUgPSAiU0lHTklGSUNBTkNFOiBEaXN0cmlidXRpb25zIG9mIG1lYW4gcmVzcG9uc2VzIiwKICAgICAgIHggPSAiTWVhbiBwcm9wb3J0aW9uIG9mICd5ZXMnIHJlc3BvbnNlcyAoYnkgc2l0ZSkiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzFiOWU3NyIsICIjMWI5ZTc3IiwgIiNkOTVmMDIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiM3NTcwYjMiLCAiI2U3Mjk4YSIsICIjNjZhNjFlIikpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjN9CnBsb3Rfc2lnX3JlbGlnCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBGfQp0ZW1wIDwtIGRfYmFzZV9udW0gJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJ0YXZlc19zdWJqIikgJT4lCiAgbGVmdF9qb2luKGRmX3JlbGlnKSAlPiUKICBnYXRoZXIocXVlc3Rpb24sIHJlc3BvbnNlLCBlbmRzX3dpdGgoIl9udW0iKSkgJT4lCiAgZmlsdGVyKGdyZXBsKCJVUyIsIHRhdmVzX2N0cnlfcmVsaWcpKQoKZ2xtZXIocmVzcG9uc2UgfiB0YXZlc19jdHJ5X3JlbGlnICsgKDEgfCB0YXZlc19zdWJqKSArICgxIHwgcXVlc3Rpb24pLCAKICAgICAgZGF0YSA9IHRlbXApICU+JQogIHN1bW1hcnkoKQpgYGAKCg==